前言
本文内容主要摘抄[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。
如果有问题,可以留言哈,多谢
参考文章
-
《》
-
《》
-
《》
历史上的今天
暂无评论...
随机推荐
git创建分支和提交分支
记录一下,以前不常用,以防出错在创建分支时,需要清除本地中的记录,比如新增,修改的文件,全部提交。git pull 同步到本地(下载)git push 同步到服务(提交)然后执行如下操作。一、git branch 查看当前分支二、git checkout -b xxx 创建xx...
三毛:说给自己听
如果有来生,要做一棵树,站成永恒,没有悲欢的姿势。一半在尘土里安详,一半在风里飞扬,一半洒落阴凉,一半沐浴阳光。非常沉默,非常骄傲。从不依靠,从不寻找。如果有来生,要化成一阵风,一瞬间也能成为永恒。没有善感的情怀,没有多情的眼睛。一半在雨里洒脱,一半在春光里旅行。...
Java Consumer的使用
前言今天有空整理一下Consumer<T> 接口的使用,一般用于回调中。这里简单记录一下。正文Consumer<T>接口是java 1.8才有的,定义如下://java.util.function.Consumer@FunctionalInterfacepu...
JNI动态注册封装C++版
前言之前JNI一直用C语言写,但发现Android Framework中大都用C++写,为了阅读方便,改为C++。其实C++跟C语言写法一样的,只不过C++更简洁些。正文修改点,举个例子不同点hello.c文件后缀改为hello.cpp,还有就是C++传入的参数更少,看起来更简洁。he...
Android NDK 部分版本下载
本文摘抄《NDK各版本下载》以便自己下载https://dl.google.com/android/repository/android-ndk-r17b-windows-x86.ziphttps://dl.google.com/android/repository/android-nd...
Android 高版本权限检测和申请
前言本文是在《Android 6.0后权限的申请》基础上整理的。本次新增了申请权限前进行检测是否有权限,没有权限的就重新申请。好记性不如烂笔头记录于此,方便自己查阅。正文public class AskPermission { public static final int ...