前言
本文内容主要摘抄[Android子线程是否可以刷新UI],这里只做简单的总结,具体还是看参考文章,谢谢。
记录于此,只是方便自己查阅。
小结
-
Activity的onCreate()周期时可以在子线程中刷新UI
-
Activity的onResume()时才创建ViewRoot,此时是不可以在子线程刷新UI
-
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。
如果有问题,可以留言哈,多谢
参考文章
-
《》
-
《》
-
《》
历史上的今天
暂无评论...
随机推荐
Fragment的简单使用
多用几次就熟悉了。以防止忘记,因此附上代码于此。(图片来自Android官网)零、Fragment的生命周期一、布局<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x...
GridView快速滚动条修改
前言之前在《Android 修改ListView快速滚动条的bar -91易搜 - 阅读是一种生活方式 ()》也介绍过,后面有个新的需求:当没有一页时需要影藏。其实也简单,代码中对个数的判断进行影藏和显示。PS:内容跟之前差不多,但这里精简写。正文GridView和ListV...
林语堂:人生的乐趣
我们只有知道一个国家人民生活的乐趣,才会真正了解这个国家,正如我们只有知道一个人怎样利用闲暇时光,才会真正了解这个人一样。只有当一个人歇下他手头不得不干的事情,开始做他所喜欢做的事情时,他的个性才会显露出来。只有当社会与公务的压力消失,金钱、名誉和野心的刺激离去,精神可以随心所欲地游荡之时,我们才会...
梁实秋 :把快乐种在心里
天下最快乐的事大概莫过于做皇帝。“首出庶物,万国咸宁”。至不济可以生杀予夺,为所欲为。至于后宫粉黛三千,御膳八珍罗列,更是不在话下。清乾隆皇帝,“称八旬之觞,镌十全之宝”,三下江南,附庸风雅。那副志得意满的神情,真是不能不令人兴起“大丈夫当如是也”的感喟。在穷措大眼里,九五之尊,乐不可支。但是试...
巴金:灯
我半夜从噩梦中惊醒,感觉到窒闷,便起来到廊上去呼吸寒夜的空气。夜是漆黑的一片,在我的脚下仿佛横着沉睡的大海,但是渐渐地像浪花似地浮起来灰白色的马路。然后夜的黑色逐渐减淡。哪里是山,哪里是房屋,哪里是菜园,我终于分辨出来了。在右边,傍山建筑的几处平房里射出来几点灯光,它们给我扫淡了黑暗的颜色。我...
米兰.昆德拉:二十四只鹧鸪
过完漫长辛苦的白天,斯大林喜欢跟他的合作者再呆上一会儿,休息中给他们说说自己生活中的小故事。比如说下面这个:一天,他决定去打猎。他穿上一件老派克,系好滑雪板,拿起一支长猎枪,跑了十三公里。那时候,他看到前面一棵树上停着几只鹧鸪。他停步,数了数,二十四只。但是运气不好!他身上只带了十二发子弹!他开枪...