Android非UI线程无法更新UI问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

Android非UI线程无法更新UI问题

2016-03-11 15:48:11 2276 2

使用HandlerThread获取Looper对象,后创建Handler(mHandlerThread.getLooper),此时的HandleMessage()在子线程中运行,为何此处可以更新UI?

public class MainActivity extends AppCompatActivity {

    private TextView mTvText ;
    private Handler mHandler;
    // 使用这个新线程获取Looper对象
    private HandlerThread mHandlerThread = new HandlerThread("my_handler_thread");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTvText = (TextView)findViewById(R.id.id_tv_text);
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper()){
            @Override
            public void handleMessage(Message msg) {
                // 此处显示在子线程中执行 handleMessage()
                // 为何在此处(子线程中)更新UI组件不会抛出异常?
                Log.v("LOG","CurThread: "+Thread.currentThread());
                // CurThread:Thread[my_handler_thread,5,Main]
                mTvText.setText("update this textView!");
            }
        };
        mHandler.sendEmptyMessage(1);
    }
}
取消 提交回答
全部回答(2)
  • elk
    2019-07-17 18:59:26

    在分线程更新,在主线程显示

    0 0
  • 蛮大人123
    2019-07-17 18:59:26

    题主的代码确实是在子线程中更新的,可以打印 thread id 验证:
    `// Use the provided Looper instead of the default one.
    public Handler(Looper looper) {}`
    所以在子线程中常常可以通过如下方法获取主线程的 handler,也可以使用题主的方法在主线程中获取子线程的 handler:
    `// 这是一个主线程的 handler
    new Handler(getContext().getMainLooper());`
    至于为什么没有crash,确实很奇怪,我去查了 setText,实在复杂,没有看出端倪,但是倘若这样去做,会 crash:

    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mHandler.sendEmptyMessage(1);
        }
    });

    crash log 如下:

    FATAL EXCEPTION: my_handler_thread
        Process: com.magellan.mapdemo, PID: 2302
        android.view.ViewRootImpl$CalledFromWrongThreadException:
         Only the original thread that created a view hierarchy can touch its views.
         ......
        at android.widget.TextView.setText(TextView.java:4862)

    所以我猜,crash 的关键词是 touch .
    结论:不应该在子线程中更新UI,非常危险!
    参考:http://stackoverflow.com/questions/14220883/accessing-ui-view-in-another-thread-does-not-cause-a-crash-why
    http://www.codes9.com/mobile-development/android/about-the-update-ui-control-does-not-ui-in-non-crash-thread-problems/

    0 0
添加回答
相关问答

8

回答

短视频SDK如何做到视频原始比例裁剪?

EdgePlus 2017-09-13 17:35:01 39969浏览量 回答数 8

323

回答

云伴侣数据导入问题汇总(Android系统)

os_admin 2011-07-26 17:52:15 63532浏览量 回答数 323

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 149016浏览量 回答数 22

15

回答

OSS学院:为什么我的图片会被下载?怎么在线播放影音?

leehon 2013-09-13 16:40:00 35863浏览量 回答数 15

1

回答

2020年了,跨平台开发框架现在怎样了?

问问小秘 2020-04-15 13:23:24 35624浏览量 回答数 1

26

回答

安卓与iOS百问,开发者系统指南

yq传送门 2017-05-31 17:16:00 34875浏览量 回答数 26

25

回答

数据库百问,教你快速上手数据库

yq传送门 2017-06-13 08:01:34 46327浏览量 回答数 25

8

回答

mail.aliyun.com邮箱android手机客户端设置方法

jack_yang 2013-04-24 09:01:34 124223浏览量 回答数 8

3

回答

JAVA web 【精品问答合集】

我是管理员 2018-07-13 16:02:35 28462浏览量 回答数 3

46

回答

H5技术百问——不懂H5你就OUT啦

yq传送门 2017-09-09 11:03:04 48516浏览量 回答数 46
+关注
蛮大人123
我说我不帅他们就打我,还说我虚伪
0
文章
7733
问答
问答排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载