首先要得到ConnectivityManager对象,然后调用getActiveNetworkInfo()方法,返回一个NetworkInfo对象。
ConnectivityManager manager= (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info=manager.getActiveNetworkInfo();
注意:查看网络连接要声明权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
WebView通常用于在应用程序中展示一些网页,而不是用浏览器去加载和显示,借助WebView我们可以在应用程序中嵌入一个浏览器,从而展示各种各样的网页。
首先要在布局中加入一个WebView
<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"></WebView>
然后使用findViewById()方法得到WebView的实例,然后调用getSettin()方法可以去设置一些浏览器的属性,这里只调用setJavaScriptEnabled()方法来让WebView支持JavaScript脚本。接着调用setWebViewClient()方法,并传入WebViewClient的匿名类作为参数,重写几个方法。最后调用WebView的loadUrl()方法,并传入网址即可。
最后,别忘了因为要访问网络,要声明访问网络的权限。
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
这里点击按钮,用一个TextView显示当前网络连接类型。在下边用一个帧布局,展示一个WebView,加载时用progressBar显示加载进度。如果加载错误,显示自定义错误!
首先是布局xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">
<TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" />
<Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="获取网络连接"/>
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"></WebView>
<TextView android:id="@+id/textview_error" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:gravity="center" />
<ProgressBar style="?android:attr/progressBarStyleHorizontal" android:id="@+id/progressbar" android:visibility="invisible" android:layout_width="match_parent" android:layout_height="wrap_content" />
</FrameLayout>
</LinearLayout>
MainActivity.java
import android.app.Activity;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private TextView textView;
private TextView textView_error;
private ConnectivityManager manager;
private WebView webview;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager= (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
textView= (TextView) findViewById(R.id.textview);
textView_error= (TextView) findViewById(R.id.textview_error);
webview= (WebView) findViewById(R.id.webview);
progressBar= (ProgressBar) findViewById(R.id.progressbar);
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {//页面加载开始
super.onPageStarted(view, url, favicon);
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {//页面加载结束
super.onPageFinished(view, url);
progressBar.setVisibility(View.INVISIBLE);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {//页面加载错误
super.onReceivedError(view, errorCode, description, failingUrl);
webview.setVisibility(View.GONE);
textView_error.setVisibility(View.VISIBLE);
textView_error.setText("加载失败");
}
});
webview.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {//当前页面加载进度
super.onProgressChanged(view, newProgress);
progressBar.setProgress(newProgress);
}
});
webview.loadUrl("http://www.baidu.com");
Button button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NetworkInfo info=manager.getActiveNetworkInfo();
if (info!=null&&info.isConnected()){
Toast.makeText(getApplicationContext(), "有网络连接", Toast.LENGTH_SHORT).show();
textView.setText(info.getTypeName());
}else{
Toast.makeText(getApplicationContext(), "无网络连接", Toast.LENGTH_SHORT).show();
textView.setText("无网络连接");
}
}
});
}
@Override
public void onBackPressed() {
if(webview.canGoBack()){
webview.goBack();//点击返回按钮,返回上一个WebView界面
}else {
finish();
}
}
}
在Android上发送HTTP请求的方式一般有两种,HttpURLConnection和HttpClient。
注意: URLConnection和HttpURLConnection使用的都是java.net中的类,属于标准的java接口。HttpURLConnection继承自URLConnection,差别在与HttpURLConnection仅仅针对Http连接。
首先我们在布局中放一个按钮,点击请求一个页面,然后用一个TextView展示返回的内容。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">
<Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="连接服务器"/>
<ScrollView android:layout_width="match_parent" android:layout_height="match_parent">
<TextView android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
MainActivity.java
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends Activity {
private static final int CONECT_SERVLET=0x23;
private TextView textView;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case CONECT_SERVLET:
String content= (String) msg.obj;
textView.setText(content);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView= (TextView) findViewById(R.id.textview);
Button button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {//不能在主线程中连接网络,所有另开启线程
@Override
public void run() {
conectServlet();
}
}).start();
}
});
}
private void conectServlet() {
try {
//自己搭建的Tomcat服务器
URL url=new URL("http://192.168.0.56:8080/MyTomcat/hello.html");
//URL url=new URL("http://www.360.com");访问360网站
URLConnection connection=url.openConnection();
BufferedReader br=new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line=br.readLine();
StringBuffer buffer=new StringBuffer();
while (line!=null){
buffer.append(line);
line=br.readLine();
}
Message message=handler.obtainMessage();
message.what=CONECT_SERVLET;
message.obj=buffer.toString();
handler.sendMessage(message);
br.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器返回的是网页的HTML代码!
HttpClient是Apache提供的HTTP网络访问接口,从一开始的时候就被引入到了Android API中。(但是在Android6.0中删除了相关API,被OKHttp代替!)
使用步骤:
1. 创建HttpClient对象。
2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6. 释放连接。无论执行方法是否成功,都必须释放连接。
具体的代码示例,就不再写了,在前边的博客中也写了具体的用法。
这里在布局中放入两个按钮,一个为单线程下载,一个为多线程下载。最上边放在一个progressBar显示当前下载的进度
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">
<ProgressBar android:id="@+id/progressbar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" />
<Button android:id="@+id/button_single" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="单线程下载"/>
<Button android:id="@+id/button_multi" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="多线程下载"/>
</LinearLayout>
然后创建一个多线程下载的类MultiThread继承Thread
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
/** * Created by Administrator on 2015/9/13. */
public class MultiThread extends Thread {
private int sum;
private long start;
private long end;
private String urlPath;//下载服务器地址
private String filePath;//下载文件存放路径
public MultiThread( long start,long end, String urlPath,String filePath) {
this.end = end;
this.filePath = filePath;
this.start = start;
this.urlPath = urlPath;
}
public int getSum() {
return sum;
}
@Override
public void run() {
try {
URL url=new URL(urlPath);
URLConnection connection=url.openConnection();
connection.setAllowUserInteraction(true);
connection.setRequestProperty("Range","bytes="+start+"-"+end);
InputStream is=connection.getInputStream();
byte[] array=new byte[1024];
File file=new File(filePath);
RandomAccessFile randomAccessFile=new RandomAccessFile(file,"rw");//随机读写文件
randomAccessFile.seek(start);
int index = is.read(array);
while (index!=-1){
randomAccessFile.write(array,0,index);
sum=sum+index;
index=is.read(array);
}
randomAccessFile.close();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里用到RandomAccessFile类,用于随机读写文件,首先生产RandomAccessFile对象,然后调用seek()方法,用来控制访问开始的位置。
MainActivity.java
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends Activity {
private ProgressBar progressbar;
private int length;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0x23:
progressbar.setProgress((int) (msg.arg1*100.0/length));
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressbar= (ProgressBar) findViewById(R.id.progressbar);
Button button_single= (Button) findViewById(R.id.button_single);
button_single.setOnClickListener(new View.OnClickListener() {//单线程下载
@Override
public void onClick(View v) {
new DownloadTask().execute();
}
});
Button button_multi= (Button) findViewById(R.id.button_multi);
button_multi.setOnClickListener(new View.OnClickListener() {//多线程下载
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
//String urlPath="http://192.168.0.30:8080/MyWebTest/music/aa.mp3";
String urlPath="http://192.168.0.56:8080/MyTomcat/AhYeah.mp3";
try {
URL url=new URL(urlPath);
URLConnection connection=url.openConnection();
length=connection.getContentLength();
File file=new File(Environment.getExternalStorageDirectory(),"AhYeah.mp3");
if (!file.exists()){
file.createNewFile();
}
MultiThread[] threads=new MultiThread[5];//这里开启5个线程下载
for (int i=0;i<5;i++){
MultiThread thread=null;
if (i==4){
thread=new MultiThread(length/5*4,length,urlPath,file.getAbsolutePath());
}else {
thread=new MultiThread(length/5*i,length/5*(i+1)-1,urlPath,file.getAbsolutePath());
}
thread.start();
threads[i]=thread;
}
boolean isFinish=true;
while (isFinish){
int sum=0;
for (MultiThread thread:threads){
sum=sum+thread.getSum();
}
Message message=handler.obtainMessage();
message.what=0x23;
message.arg1=sum;
handler.sendMessage(message);
if (sum>=length){
isFinish=false;
}
Thread.sleep(1000);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
});
}
class DownloadTask extends AsyncTask<String,Integer,String>{
@Override
protected String doInBackground(String... params) {
try {
//访问下载搭建的服务器下的图片
URL url=new URL("http://192.168.0.56:8080/MyTomcat/weheartit.png");
URLConnection connection=url.openConnection();
int length=connection.getContentLength();
File file=new File(Environment.getExternalStorageDirectory(),"weheartit.png");
if(!file.exists()){
file.createNewFile();
}
InputStream is=connection.getInputStream();
OutputStream os=new FileOutputStream(file);
byte[] array=new byte[1024];
int sum=0;
int index=is.read(array);
while (index!=-1){
os.write(array,0,index);
sum=sum+index;
publishProgress(sum,length);
index=is.read(array);
}
os.flush();
os.close();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "您好,文件已下载完成";
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressbar.setProgress((int)(values[0]*100.0/values[1]));
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();
}
}
}