android HttpGet 另开线程获取网络数据问题

publicclassGetNetData{//get形式publicstaticStringgetResultForHttpGet(Stringurl)throwsCl... public class GetNetData {

//get形式
public static String getResultForHttpGet(String url) throws ClientProtocolException, IOException
{
String result="";

HttpGet httpGet=new HttpGet(url);//
HttpResponse response=new DefaultHttpClient().execute(httpGet);
if(response.getStatusLine().getStatusCode()==200){
HttpEntity entity=response.getEntity();
result=EntityUtils.toString(entity, HTTP.UTF_8);
}
return result;
}

}

我的程序老多地方都调用了 getResultForHttpGet
()来获取网络数据 但网慢的时候程序会卡死 我要是想在不改变其它代码情况下,就在这个getResultForHttpGet中把他变成多线程中处理然后返回 return result;
不影响其它代码的运行是不是很困难呀 我是个新手不好意思 能帮我改一下吗 如果不能实现也请告诉我 我也就研究研究其它地方谢谢了
展开
 我来答
匿名用户
推荐于2016-05-24
展开全部
你用的是很旧的android版本了吧?新版本的android(好像是sdk10以上)已经不允许在UI线程(主线程)中发起网络请求了,会抛出NetWorkInUIThreadException。

android跨线程通讯可以使用android.os.Handler-android.os.Message这两类对象完成。

public static void getResultForHttpGet(final String url,final Handler handler) throws ClientProtocolException, IOException{
new Thread(){
@Override
public void run() {
String result="";
HttpGet httpGet=new HttpGet(url);//
HttpResponse response=new DefaultHttpClient().execute(httpGet);
int statusCode=response.getStatusLine().getStatusCode();
if(statusCode==200){
HttpEntity entity=response.getEntity();
result=EntityUtils.toString(entity, HTTP.UTF_8);
}
Message msg=handler.obtainMessage(statusCode, result);
msg.sendToTarget();
}
}.start();

}
原获得返回值之后的代码写到 handler参数对象重写的handleMessage方法中,如果直接发起请求的类不是Activity,可以自定义接口来将信息传递给Activity。
private Handler handler1 = new MyHandler();
private class MyHandler extends Handler{
public void handleMessage(Message msg) {
int statusCode = msg.what;
if(statusCode==200){
String result = msg.obj.toString();
//do your business
}else{
// throw exception or show error message
}
}
};
private Handler handler2 = new MyHandler2();
private class MyHandler2 extends Handler{
public void handleMessage(Message msg) {
int statusCode = msg.what;
if(statusCode==200){
String result = msg.obj.toString();
//do other business
}else{
// throw exception or show error message
}
}
};
此外handler的post(Runnable r)方法也是跨线程操作的重要方法

//注意,若如此做,在Activity中构建的handler对象在Activity销毁后仍然有可能接收消息并执行handleMessage方法,应设法避免。关键字:handler内存泄漏
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式