只有在创建了View树的原始线程(一般为主线程)中才能操作树中的view。
-
AsyncTask的解决:
新建类, extends AsyncTask<String,Void, Bitmap>
// AsyncTask实现类中对ImageView的弱引用
private final WeakReference<ImageView> imageViewReference;
// 构造方法中实例化WeakReference对象
imageViewReference = new WeakReference<ImageView>(imageView);
// 通过弱引用对构造方法中传入的ImageView实例进行操作
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
2、 Handler解决:
*实例化一个Handler对象:
Handler handler = new Handler() {
super.handleMessage(msg);
if(msg.what == SUCCESS) { //SUCCESS为int常量,值为0
imageView.setImageBitmap((Bitmap)msg.obj);
}
};
*子线程中发送message:
run() {
Bitmap bitmap = getImageFromNet(url); // 得到bitmap实例
Message msg = new Message();
msg.what = SUCCESS; // SUCCESS为int常量,值为0
msg.obj = bitmap;
handler.sendMessage(msg);
}