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();的封装,只不过帮我们把异常处理给解决了
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sdlg2015/article/details/49933303

android中在子线程中更新UI的几种方法

我们都知道android中,不允许在子线程中更新UI,凡是更新UI的操作必须放到主线程中,否则就会报如下异常: android.view.ViewRoot$CalledFromWrongThread...
  • u013320868
  • u013320868
  • 2016-04-20 23:24:38
  • 956

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

如果你在网上搜索CalledFromWrongThreadException:Only the original thread that created a view hierarchy can to...
  • cyp331203
  • cyp331203
  • 2015-03-22 18:31:25
  • 1021

Android在子线程更新UI的4种方法

Android在子线程更新UI的4种方法              搞Android开发也有一段时间了,期间看过很多的博客、源码,但是到现在存在自己记忆中的知识点却廖廖无几,反思了原因:每次都是遇到...
  • CHTSX
  • CHTSX
  • 2015-03-10 18:51:00
  • 1337

android子线程中更新UI的方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 参考:Android子线程 方法一:用Handler ...
  • chenyq2008
  • chenyq2008
  • 2015-03-10 23:26:16
  • 8127

android中子线程更新UI的方式浅析

一、为何写作此文  你是不是经常看到很多书籍中说:不能在子线程中操作ui,不然会报错。你是不是也遇到了如下的疑惑(见下面的代码):@Override protected void onCr...
  • a910626
  • a910626
  • 2015-05-23 23:44:26
  • 3726

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

问题描述  做过android开发基本都遇见过ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改ui,子线程要修改ui...
  • zhao_zepeng
  • zhao_zepeng
  • 2016-01-26 18:54:25
  • 10840

Android在子线程中更新UI的方法汇总(共七种)

1、常规写法:new Handler()的handleMessage()和handler.sendMessage(msg) 2、handler的另一种用法: 3、handler.post(runn...
  • qq_26287435
  • qq_26287435
  • 2017-03-23 20:50:58
  • 747

Android中子线程真的不能更新UI吗?

Android的UI访问是没有加锁的,这样在多个线程访问UI是不安全的。所以Android中规定只能在UI线程中访问UI。但是有没有极端的情况?使得我们在子线程中访问UI也可以使程序跑起来呢?...
  • xyh269
  • xyh269
  • 2016-10-03 17:58:44
  • 9226

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

第一种:new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() {...
  • u010507199
  • u010507199
  • 2017-05-03 10:50:21
  • 2473

子线程中更新UI不报错问题

public class MainActivity extends Activity {     private TextView textview;     @Override     pro...
  • wb1211
  • wb1211
  • 2016-08-02 11:47:19
  • 674
收藏助手
不良信息举报
您举报文章:Android进阶-子线程中刷新UI的讨论
举报原因:
原因补充:

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