请选择 进入手机版 | 继续访问电脑版
本站特色:极好的技术研究氛围!所有技术交流,必有回复!

疯狂Java联盟

 找回密码
 加入联盟
查看: 133|回复: 0

[Android] Android在子线程更新UI的三种方式

[复制链接]
发表于 2018-10-13 20:13:45 | 显示全部楼层 |阅读模式
本帖最后由 luo_wenqiang 于 2018-10-13 20:26 编辑

    在Android里面,禁止子线程更新UI,只能在UI线程里面更新UI,但是经常我们会需要使用子线程来更新UI的,所以这里提供3中解决方案。这些解决方案在《疯狂Android讲义》上面都有详细描述,这里仅仅是总结归纳一下。

    1.使用Activity中继承得到的runOnUiThread方法,该方法是每个Activity都具有的,表示在UI线程执行UI更新
  • // 启动一个线程
  • new Thread(new Runnable() {
  •     @Override
  •     public void run() {
  •         try {
  •             // 远程获取数据
  •             final IndexPage page = RemoteData.getIndexPage();
  •             // 把数据通过runOnUiThread方法传递给UI线程,更新UI
  •             runOnUiThread(new Runnable() {
  •                 @Override
  •                 public void run() {
  •                     processData(page);
  •                 }
  •             });
  •         } catch (Throwable e) {
  •         }
  •     }).start();



    2.所有的View都有post方法,该方法接受一个Runnable类型的参数,表示把视图更新交给View本身去负责
  • // 这是通过OkHttp异步方式获取图片的回调。异步方式本身就是在另外一个线程里面执行的,不在UI里面。
  • // 所以这里也属于是在子线程执行的任务
  • @Override
  • public void onResponse(Call call, Response response) throws IOException {
  •     final Bitmap bitmap;
  •     // 把获取到的图片,转换为Bitmap对象
  •     try (InputStream in = response.body().byteStream()) {
  •         bitmap = BitmapFactory.decodeStream(in);
  •     }
  •     // 把Bitmap设置给对象,意味着就是更新UI,所以要post到视图里面去,让视图去更新
  •     imageView.post(new Runnable() {
  •         @Override
  •         public void run() {
  •             imageView.setImageBitmap(bitmap);
  •         }
  •     });
  • }

    3.还有Handler事件传递机制,在子线程中,把事件发给UI线程
  • // 使用匿名内部类的方式,创建一个Handler实例,并重写handleMessage方法
  • // 其他线程通过此Handler对象发送Message过来,就可以实现在UI线程更新视图了
  • private Handler promptHandler = new Handler() {
  •     @Override
  •     public void handleMessage(Message msg) {
  •         new AlertDialog.Builder(MainActivity.this)
  •                 .setTitle("错误提示")
  •                 .setMessage("无法获取数据,请检查网络!")
  •                 .show();
  •     }
  • };
  • // 中间省略了大量代码
  • // 下面一行是在子线程出现异常的时候,发送消息给Handler的代码
  • promptHandler.sendEmptyMessage(500);


您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

小黑屋|手机版|Archiver|疯狂Java联盟 ( 粤ICP备11094030号 )

GMT+8, 2018-11-21 12:15 , Processed in 0.140956 second(s), 6 queries , File On.

快速回复 返回顶部 返回列表