Android进阶-子线程中刷新UI的讨论

原创 2015年11月19日 20:28:19

Android进阶-子线程中刷新UI的讨论

我们经常会遇到这个错误 -> 不可以在主线程之外更新UI
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views。

一般,我们将耗时操作,都放在子线程中。但是:

子线程中能不能更新UI呢?

  • 首先,Google是不推荐在子线程中更新UI的,对于主线程(UI),
    • Do not block the UI thread
    • Do not access the Android UI toolkit from outside the UI thread
    • 但是其实在子线程中也是可以更新UI, 那是在什么情况下可以呢?
      • 当在Activity的onCreate()方法刚开始时,并且子线程中逻辑简单时,就可以更新UI
      • 这是因为,Android系统内部有一个类会去检查UI刷新的线程。(这个类的 invalidate方法回去检查是否可以更新UI)
      • 那么,在这个类还没有初识化成功时,我们是可以更新UI的。
    • 即我们是可以在子线程更新UI的,但条件是非常苛刻的,靠运气

如何在子线程中更新UI

  • 使用Handler + message
    • 场合:如果是后台任务,像是下载任务等,就需要使用AsyncTask。 如果需要传递状态值等信息,像是蓝牙编程中的socket连接,就需要利用状态值来提示连接状态以及做相应的处理,
    • 就可以使用这种方式
  • 使用Activity.runOnUiThread(Runnable runnable)
new Thread() {
        public void run() {
            //这儿是耗时操作,完成之后更新UI;
            runOnUiThread(new Runnable(){

                @Override
                public void run() {
                    //更新UI
                    imageView.setImageBitmap(bitmap);
                }
            });
        }
    }.start()
  • View.post(Runnable r)
    • Causes the Runnable to be added to the message queue, to be run after the specified amount of time elapses.
    • The runnable will be run on the user interface thread
    • 即这样,Runnable会运行在UI线程, 不过,时间可能延迟,

如何延迟线程

  1. Handler.postDelayed()
    public final boolean postDelayed (Runnable r, long delayMillis)
    这个方法我们可以利用他来做延迟,但是不能用来在子线程中更新UI。
    例如,在主线程中延迟
            new Handler().postDelayed(new Runnable() {
                @Override
                             public void run() {

                }
            }, 2000);   //用来做延迟, 还酬和
延迟两秒执行Runnable, 这个Runnable是在创建Handler的线程中执行的。

2. Thread.sleep(2000);
- 这个方法很普通,就是进行线程延时, 但是要处理异常(代码变丑了)

  1. SystemClock.sleep(2000);
    • 这个方法实际上是对Thread.sleep();的封装,只不过帮我们把异常处理给解决了
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android_子线程创建消息队列更新UI

  • 2015年12月07日 00:16
  • 2.53MB
  • 下载

android 不能在子线程中更新ui的讨论和分析

问题描述  做过android开发基本都遇见过ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改ui,子线程要修改ui...

android 不能在子线程中更新ui的讨论和分析

相信初学者通常以为只能在主线程更新UI,那么能在其他线程更新UI?下面这篇文章将讨论下能否在子线程中更新UI文章地址:http://blog.csdn.net/self_study问题描述做过Andr...

Android子线程在没有ViewRoot的情况下能刷新UI吗?

如果你看了我写的《Android里子线程真的不能刷新UI吗?》,会回答:不能。那么到底能不能呢?呵呵,其实是能的了。那么《Android里子线程真的不能刷新UI吗?》里写错了吗?嗯,没有。呵呵,相信大...

Android子线程其实也可以刷新UI。。。。

如果你在网上搜索CalledFromWrongThreadException:Only the original thread that created a view hierarchy can to...

Android进阶(十六)子线程调用Toast报Can't create handler inside thread that has not called Looper.prepare() 错误

原子线程调用Toast报Can't create handler inside thread that has not called Looper.prepare() 错误 今天用子线程调Toast报...

知识梳理:Android子线程中更新UI的3种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法:  在看方法之前看一下Android中消息机制:    ...
  • jsonnan
  • jsonnan
  • 2016年05月03日 22:32
  • 507

Android子线程中更新UI的3种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法。 一. 引言 首先来看一下Android中消息机制: 专业术语:...
  • silleyj
  • silleyj
  • 2017年02月12日 22:30
  • 4314

Android子线程中更新UI的三种方法和获取message的两种方法总结

Android子线程中更新UI的三种方法和获取message的两种方法总结

Android能否在子线程中更新UI呢?

如题,Android能否在子线程中更新UI呢?这是一道面试题。那么这道题应该怎么去回答呢?在此我给出个人答案:“Android是不允许在子线程中更新UI的,但是在某种特殊情况下子线程是可以更新UI的”...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android进阶-子线程中刷新UI的讨论
举报原因:
原因补充:

(最多只允许输入30个字)