报错:
Only the original thread that created a view hierarchy can touch its views.
原因:
子线程中不能更新ui操作
主线程更新UI方式:
更新UI方法一:handler.post
更新UI方法二:view.post
更新UI方法三:runOnUiThread
更新UI方法四:handler.handleMessage
示例:
public class ThreadActivity extends FragmentActivity {
/*更新UI方法四:handler.handleMessage*/
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
Log.e("111", "开始下载");
break;
case 1:
Log.e("111", "设置图片");
mIv.setImageBitmap((Bitmap) msg.obj);
Log.e("111", "handler.handleMessage为:" + Looper.getMainLooper().getThread());//Thread[main,5,main]
Log.e("111", "handler.handleMessage 名称为:" + Thread.currentThread().getName());//main
break;
case 2:
Log.e("111", "设置完毕");
break;
}
}
};
private ImageView mIv;
private String path = "https://github.com/Ablexq/MyTabs/raw/master/pic/a.jpg";
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_thread);
mIv = ((ImageView) this.findViewById(R.id.iv));
Log.e("111", "主线程(UI线程)为:" + Looper.getMainLooper().getThread());//Thread[main,5,main]
Log.e("111", "主线程(UI线程)名称为:" + Thread.currentThread().getName());//main
new Thread(new Runnable() {//子线程
@Override
public void run() {
//下载前
handler.sendEmptyMessage(0);
Bitmap bm = null;
try {
HttpURLConnection huc = (HttpURLConnection) new URL(path).openConnection();
huc.connect();
if (huc.getResponseCode() == 200) {
bm = BitmapFactory.decodeStream(huc.getInputStream());
}
//设置图片
Message message = Message.obtain();
message.obj = bm;
message.what = 1;
handler.sendMessage(message);
//设置图片后
handler.sendEmptyMessage(2);
} catch (IOException e) {
e.printStackTrace();
}
Log.e("111", "new Thread线程为:" + Thread.currentThread());//Thread[Thread-5,5,main]
Log.e("111", "new Thread线程 名称为:" + Thread.currentThread().getName());//Thread-5
final Bitmap finalBm = bm;
/*更新UI方法一:handler.post*/
// handler.post(new Runnable() {
// @Override
// public void run() {
// Log.e("111", "handler.post线程为:" + Thread.currentThread());//Thread[main,5,main]
// Log.e("111", "handler.post线程 名称为:" + Thread.currentThread().getName());//main
// mIv.setImageBitmap(finalBm);
// }
// });
/*更新UI方法二:view.post*/
// mIv.post(new Runnable() {
// @Override
// public void run() {
// Log.e("111", "view.post线程为:" + Thread.currentThread());//Thread[main,5,main]
// Log.e("111", "view.post线程 名称为:" + Thread.currentThread().getName());//main
// mIv.setImageBitmap(finalBm);
// }
// });
/*更新UI方法三:runOnUiThread*/
// runOnUiThread(new Runnable() {
// @Override
// public void run() {
// Log.e("111", "runOnUiThread线程为:" + Thread.currentThread());//Thread[main,5,main]
// Log.e("111", "runOnUiThread线程 名称为:" + Thread.currentThread().getName());//main
//
// mIv.setImageBitmap(finalBm);
// }
// });
}
}).start();
}
}