安卓4.0以上的系统开始不允许开发者在主线程中访问网络,之前我已经意识到了google这样做的用意了。我原来用安卓2.x.x的时候做过一个访问网络的软件,那个软件如果在访问网络的时候不是及时响应的话,主界面 就会卡住,所以我写了一个异步访问网络的类。以后应该会常用到。
下面放出代码
package com.android.json;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import org.apache.http.client.methods.HttpGet;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.Toast;
public class NetCheckWebServer {
private Handler handler;
private String checkUrl;
private int checkTimeout;
public NetCheckWebServer(String checkUrl, int checkTimeout,
Handler handler) {
this.handler = handler;
this.checkUrl = checkUrl;
this.checkTimeout = checkTimeout;
startCheck();
}
private void startCheck() {
// long webServerCheckStartTime = System.currentTimeMillis();
final int webServerTimeOutInt = 5000;
new Thread(new Runnable() {
boolean flag = true;
public void run() {
Looper.prepare();
while (flag) {
new Thread(new Runnable() {
public void run() {
Looper.prepare();
String str=checkT_Network(checkUrl, webServerTimeOutInt);
if (str.length()!=0) {
sendMsgToCheckWebserverHandler(str);
flag = false;
}
}
}).start();
try {
Thread.sleep(webServerTimeOutInt); // ��ʱXXX����
} catch (InterruptedException e) {
e.printStackTrace();
}
// if (System.currentTimeMillis() - webServerCheckStartTime > checkTimeout * 1000) {
// break;
// }
}
}
}).start();
}
private void sendMsgToCheckWebserverHandler(String what) {
Message msg = new Message();
msg.obj=what.toString();
handler.sendMessage(msg);
}
/**
* Head�����ж�ָ�������ַ��http����˿��Ƿ���Է���
*
* @param serverUrl
* @return
*/
private String checkT_Network(String request_word, int timerout) {
boolean newWorkOk_Flag = false;
int responseCode = 0;
// TODO Auto-generated method stub
String strUrl = request_word;
String strResult = "";
strResult = connServerForResult(strUrl);
return strResult;
}
private String connServerForResult(String strUrl) {
// TODO Auto-generated method stub
HttpGet httpRequest = new HttpGet(strUrl);
String temp = "";
String strResult = "";
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection对象,我们可以从网络中获取网页数据.
conn.setConnectTimeout(3000); // 单位是毫秒,设置超时时间为5秒
conn.setRequestMethod("GET"); //
if (conn.getResponseCode() == 200) {// 判断请求码是否是200码,否则失败
InputStream is = conn.getInputStream(); // 获取输入流
byte[] data = readStream(is); // 把输入流转换成字符数组
strResult = new String(data); // 把字符数组转换成字符串
}
} catch (Exception e) {
// TODO: handle exception
}
return strResult;
}
public static byte[] readStream(InputStream inputStream) throws Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
bout.write(buffer, 0, len);
}
bout.close();
inputStream.close();
return bout.toByteArray();
}
}
在这里就不做过多的解释了。都挺易懂的