前言
本文内容主要摘抄[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。
如果有问题,可以留言哈,多谢
参考文章
-
《》
-
《》
-
《》
历史上的今天
暂无评论...
随机推荐
[摘抄]Linux之find命令详解
前言find是个使用频率比较高的命令。常常用它在系统特定目录下,查找具有某种特征的文件。记录一下,方便自己查阅。正文命令的格式:find [-path……] -options [-print -exec -ok]path要查找的目录路~ 表示$HOME目录. 表示当前目录/ 表...
Android的软解码和硬解码
在MediaCodec里有接口可以枚举所有解码格式,每种编码可能都有多个解码器。MediaCodec mediaCodec = MediaCodec.createDecoderByType("video/avc");我的应用里面接收的是H264编码数据,所以我选取的是video/avc,我们...
[摘]对于Fragment的一些理解
Fragment为何要用Fragment是Android 3.0 (Honeycomb)被引入的。主要目的是为了给大屏幕(如平板电脑)上更加动态和灵活的UI设计提供支持。由于平板电脑的屏幕比手机的屏幕大很多,因此可用于组合和交换的UI组件的空间更大,利用Fragment实现此类设计的时,就无需管...
Android跳转WIFI界面的几种方式
前言简单记录一下Android跳转WiFi设置界面的启动方式。PS: 本文摘抄的,方便自己查阅。正文下面几种方式在Android P上测试OK。第一种try { Intent intent = new Intent(); intent.setAction("androi...
Android状态栏之LabelView
前言LabelView是一个监听栈顶应用变化并应用的label(也就是应用名称)展示的View。一般在顶部状态栏中常用。封装在一起,这样只需要在xml中添加即可,简单方便,可移植。记录于此,方便自己查阅。正文涉及功能时时监听顶部Activity变化获取当前Activity的la...
书单-白岩松《痛并快乐着》
1”是健康,婚姻、事业、金钱就是后面一个又一个“0”;健康这个“1”在的时候,后面的“0”越多,你的人生越丰富;而前面这个健康的“1”一旦不在了,你后面的“0”再多,人生也只是一个“0”。【笔记:生命是革命的本钱】 背靠着大树,自己却并不是大树。【笔记:那就让自己成为大树吧】&nbs...