handler明明已经在主线程中调用了,为何更新不了UI线程的?android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
具体报错android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
public void loadImage(final String path,final ImageView imageView){
//让imageView携带一个数据,由于gridView重写getView,是不断调用的
//要使用settag 将path保存, 加载成功后 设置image的图片前需要 gettag进行判断,防止图片的混乱
imageView.setTag(path);
if (mUIHandler==null) {
Looper mainLooper = Looper.getMainLooper();
mUIHandler=new Handler(mainLooper){
@Override
public void handleMessage(Message msg) {
/**
* 得到图片,为imageView设置图片
*/
//取出消息中的数据
ImageHolder holder=(ImageHolder) msg.obj;
Bitmap bm=holder.bitmap;
ImageView imageView=holder.imageView;
String path=holder.path;
//取出imageView所携带的数据,判断与holder中的path是否一致
//这是由于第一屏和第二屏之间的数据可能不清,为了防止图片设置混乱
if (imageView.getTag().toString().equals(path)) {
imageView.setImageBitmap(bm);
}
}
};
}
//根据path在缓存中取出bitmap
Bitmap bm=getBitmapFromLruCache(path);
//判断是否已经缓存好了,如果bitmap不为空,就可以为imageView设置图片了
if (bm!=null) {
/**
* 更新UI
*/
reflashBitmap(path, imageView, bm);
}else{
//缓存为空的话,说明需要去加载图片
addTask(new Runnable() {
@Override
public void run() {
//加载图片
//图片的压缩
//1、获取图片的大小
ImageSize imageSize=getImageViewSize(imageView);
//2、压缩图片
Bitmap bm=decodeSampledBitmapFromPath(path,imageSize.width,imageSize.height);
/**
* 将压缩的图片加入缓存
*/
addBimapToLruCache(path,bm);
/**
* 加入缓存后,进行回调,也就是准备发送消息给Handler更新UI
*/
reflashBitmap(path, imageView, bm);
/**
* release()释放许可,即添加一个许可,即
*/
mSemaphoreThreadPool.release();
}
});
}
}