1. Android not responding(ANR)应用程序无响应
异常
4.0以上的android版本 如果发现网络操作放在主线程之中,就会报错误
异常:
CalledFromWrongThreadException:Only the original thread that created a view hierarchy can
touchits views
只有原始线程(主线程/UI线程)才能修改view对象
在子线程中修改view对象,会throw以上的异常
2. 子线程中的数据想传递给主线程
这个涉及到android里面的消息机制--handler类
主线程中 采用 handleMessage方法获得message
子线程中 采用 handler.sendMessage方法发送message
实现主线程和子线程之间的通信
private Handler handler = new Handler(){
/**
* 接收消息
*/
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == SUCCESS) {
ivPic.setImageBitmap((Bitmap) msg.obj);
}else if(msg.what==ERROR){
Toast.makeText(MainActivity.this, "图片抓取失败", Toast.LENGTH_LONG).show();
}
}
};
@Override
public void onClick(View v) {
final String url = etUrl.getText().toString();
/**
* 主线程里面添加子线程
*/
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = getPictureFromNet(url);
if (bitmap != null) {
Message msg = new Message();
msg.what = SUCCESS;
handler.sendMessage(msg);
msg.obj = bitmap;
handler.sendMessage(msg);
}else{
Message msg = new Message();
msg.what = ERROR;
}
}
}).start();