安卓之多线程请求数据

安卓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();
	}
}
在这里就不做过多的解释了。都挺易懂的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值