Android子线程是否可以更新UI么

Android  2024年10月21日 am8:08发布5天前更新 91es.com站长
15 0 0

前言

本文内容主要摘抄[Android子线程是否可以刷新UI],这里只做简单的总结,具体还是看参考文章,谢谢。

记录于此,只是方便自己查阅。

小结

  1. Android子线程(非UI线程)可以刷新UI,前提条件是有自己的ViewRoot。

  2. Activity的onCreate()周期时可以在子线程中刷新UI

  3. Activity的onResume()时才创建ViewRoot,此时是不可以在子线程刷新UI

  4. Activity的onStart()时在子线程可以刷新UI

正文

下面根据上面4点单独介绍(都是抄袭的哈,推荐看原文)。

第一点

Android子线程(非UI线程)可以刷新UI,前提条件是有自己的ViewRoot。

class NonUiThread extends Thread {
    @Override
    public void run() {
        Looper.prepare();
        TextView textView = new TextView(MainActivity.this);
        textView.setText("non-UiThread update textview");
        textView.setTextColor(Color.RED);
        textView.setGravity(Gravity.CENTER);
        textView.setTextSize(50);
        textView.setBackgroundColor(Color.BLACK);
        WindowManager windowManager = MainActivity.this.getWindowManager();
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                400, 400, 0, 0, WindowManager.LayoutParams.FIRST_SUB_WINDOW,
                WindowManager.LayoutParams.TYPE_TOAST, PixelFormat.OPAQUE);
        windowManager.addView(textView, params);
        Looper.loop();
    }
}

亲测,可以正常显示。

第二点

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //子线程
    new Thread(new Runnable() {
        @Override
        public void run() {
            ((Button) findViewById(R.id.main_bt_one)).setText("哈哈哈哈哈");
        }
    }).start();
}

正常显示。

第三点

是在onResume里面,对应ActivityThread就是handleResumeActivity这个方法。

final void handleResumeActivity(IBinder token,
            boolean clearHide, boolean isForward, boolean reallyResume) {
        // If we are getting ready to gc after going to the background, well
        // we are back active so skip it.
        unscheduleGcIdler();
        mSomeActivitiesChanged = true;

        // TODO Push resumeArgs into the activity for consideration
        ActivityClientRecord r = performResumeActivity(token, clearHide);
        ......
        if (r.window == null && !a.mFinished && willBeVisible) {
            r.window = r.activity.getWindow();
            View decor = r.window.getDecorView();
            decor.setVisibility(View.INVISIBLE);
            ViewManager wm = a.getWindowManager();
            WindowManager.LayoutParams l = r.window.getAttributes();
            a.mDecor = decor;
            l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
            l.softInputMode |= forwardBit;
            if (a.mVisibleFromClient) {
                a.mWindowAdded = true;
                wm.addView(decor, l);
            }

        // If the window has already been added, but during resume
        // we started another activity, then don't yet make the
        // window visible.
        } else if (!willBeVisible) {
            if (localLOGV) Slog.v(
                TAG, "Launch " + r + " mStartedActivity set");
            r.hideForNow = true;
        }
    ......
}

第四点

这个是参考文2最后提的问题。

activity.onStart()里通过线程刷新UI能成功吗?

我测试过,不管哪种启动模式,onStart()时子线程都可以刷新UI。

如果有问题,可以留言哈,多谢

参考文章

  1. Android子线程真的不能更新UI么

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

  3. Activity的启动模式分析

 历史上的今天

  1. 2021: 海子:以梦为马(0条评论)
  2. 2019: 王小波:肚子里的战争(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

Fragment的简单使用

多用几次就熟悉了。以防止忘记,因此附上代码于此。(图片来自Android官网)零、Fragment的生命周期一、布局<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x...

GridView快速滚动条修改

前言之前在《Android 修改ListView快速滚动条的bar -91易搜 - 阅读是一种生活方式 ()》也介绍过,后面有个新的需求:当没有一页时需要影藏。其实也简单,代码中对个数的判断进行影藏和显示。PS:内容跟之前差不多,但这里精简写。正文GridView和ListV...

林语堂:人生的乐趣

我们只有知道一个国家人民生活的乐趣,才会真正了解这个国家,正如我们只有知道一个人怎样利用闲暇时光,才会真正了解这个人一样。只有当一个人歇下他手头不得不干的事情,开始做他所喜欢做的事情时,他的个性才会显露出来。只有当社会与公务的压力消失,金钱、名誉和野心的刺激离去,精神可以随心所欲地游荡之时,我们才会...

梁实秋 :把快乐种在心里

天下最快乐的事大概莫过于做皇帝。“首出庶物,万国咸宁”。至不济可以生杀予夺,为所欲为。至于后宫粉黛三千,御膳八珍罗列,更是不在话下。清乾隆皇帝,“称八旬之觞,镌十全之宝”,三下江南,附庸风雅。那副志得意满的神情,真是不能不令人兴起“大丈夫当如是也”的感喟。在穷措大眼里,九五之尊,乐不可支。但是试...

巴金:灯

我半夜从噩梦中惊醒,感觉到窒闷,便起来到廊上去呼吸寒夜的空气。夜是漆黑的一片,在我的脚下仿佛横着沉睡的大海,但是渐渐地像浪花似地浮起来灰白色的马路。然后夜的黑色逐渐减淡。哪里是山,哪里是房屋,哪里是菜园,我终于分辨出来了。在右边,傍山建筑的几处平房里射出来几点灯光,它们给我扫淡了黑暗的颜色。我...

米兰.昆德拉:二十四只鹧鸪

过完漫长辛苦的白天,斯大林喜欢跟他的合作者再呆上一会儿,休息中给他们说说自己生活中的小故事。比如说下面这个:一天,他决定去打猎。他穿上一件老派克,系好滑雪板,拿起一支长猎枪,跑了十三公里。那时候,他看到前面一棵树上停着几只鹧鸪。他停步,数了数,二十四只。但是运气不好!他身上只带了十二发子弹!他开枪...