您的位置:首页 > 理论基础 > 计算机网络

Android中网络请求放在子线程中问题

2015-12-13 16:12 561 查看
android 4.0版本过后,耗时的请求都是放在子线程中。

android项目新建后会自动产生消息队列和消息轮询器,子线程通过发送新的消息,被轮询器发现,然后调用handler中的handleMessage()方法,实现更新UI。下面是下载网络图片例子:

public class Download_picActivity extends Activity {

// 此方法在主线程中调用,可以更新UI
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
// 处理消息时需要知道是成功的消息还是失败的消息
switch (msg.what) {
case 1:
ImageView iv = (ImageView) findViewById(R.id.iv);
// 将位图对象显示至imageView
iv.setImageBitmap((Bitmap) msg.obj);
break;
case 0:
Toast.makeText(Download_picActivity.this, "请求失败", 0).show();
break;
default:
break;
}

}
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

public void click(View v) {
Thread t = new Thread() {
@Override
public void run() {
// 下载图片
// 1.确定网址
String path = "http://172.23.252.83:8080/superman.png";

try {
// 2.把网址封装成一个url对象
URL url = new URL(path);
// 3.获取链接对象,此时还没有建立连接
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 4.对链接对象初始化

// 设置请求方法,注意大写
conn.setRequestMethod("GET");
// 设置连接超时
conn.setConnectTimeout(5000);
// 设置读取超时
conn.setReadTimeout(5000);
// 5.发送请求与服务器建立连接
conn.connect();
// 如果状态码等于200,说明请求成功
if (conn.getResponseCode() == 200) {
// 获取服务器相应头中的流,流中的数据就是客户端请求的数据
InputStream is = conn.getInputStream();
//读取出流里的数据,并构造成位图对象
Bitmap bm = BitmapFactory.decodeStream(is);
// ImageView iv = (ImageView) findViewById(R.id.iv);
// 将位图对象显示至imageView
// iv.setImageBitmap(bm);
// 将消息发送至主线程的消息队列
Message msg = new Message();
// 消息对象可以携带数据
msg.obj = bm;
msg.what = 1;
handler.sendMessage(msg);
} else {
// Toast.makeText(Download_picActivity.this, "请求失败",
// 0).show();
Message msg = handler.obtainMessage();
msg.what = 0;
handler.sendMessage(msg);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
};
t.start();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android