-
在子线程中更新UI 1.当刚启动Activity即onCreate里面此时onResume方法还没有执行的时候可以,因为在线程中更新UI时会调用ViewParent.invalidateChild()方法检查当前的Thread是否是UIThread,若为UIThread则可以更新(ViewParent是一个接口类,其实现是ViewRootImpl;invalidateChild()方法调用checkThread()方法来检查线程是否为主线程)。ViewRootImp是在onResume方法中初始化的,所以只要在ViewRootImpl创建之前更新UI(在onCreate方法中创建线程并执行,此时还没有初始化ViewRootImp),就可以逃避掉checkThread()的检查进而更新UI。 2.-->刚启动的时候,立即在非UI线程更新->不报错(onResume还没有执行) --->休眠2s钟以后,更新——————>报错查看全部
-
更新UI的4种方式(其实内部都是handler机制): 1.通过Handler的post方法(); 2.调用Handler.sendMessage()或Handler.sendEmptyMessage()方法,传统的方法 3.重写Activity中的runOnUIThread方法更新; 4.调用View自身的post(Runnable run)方法更新;查看全部
-
1. 子线程向主线程发送消息,必须有主线程的Handler,该Handler绑定了主线程的Looper。 2. 主线程向子线程发送消息,必须有子线程的Looper,为了防止Looper没有初始化,所以通过HandlerThread类,来保证子线程的Looper再被主线程调用时已经初始化。查看全部
-
图解handler looper message messagequeen的关系查看全部
-
handler中常见的两种报错 第一种是直接更新UI 第二种是没有指定Looper对象查看全部
-
Handler的原理是什么查看全部
-
面试用:在非主线程是否可以更新UI 答:当刚启动还没有onResume的时候可以,即onCreate里面 ViewRootImp是在onResume方法中初始化的,在onCreate方法中创建线程并执行,此时还没有初始化ViewRootImp查看全部
-
android为什么要设计只能通过Handler机制更新UI查看全部
-
callback拦截信息查看全部
-
第四种方法ViewUI textView自身的post 方法 new Runnable查看全部
-
第三种方法runOnUiThread查看全部
-
更新UI的四种方法,第一种是 handler的post方法new Runnable。 第二种是 handler的sendMessage 、要sendEmptyMessage查看全部
-
handler是什么查看全部
-
1. Handler在创建的时候可以指定Looper,这样通过Handler的sendMessage()方法发送出去的消息就会添加到指定Looper里面的MessageQueue里面去。在不指定Looper的情况下Handler绑定的是创建它的线程的Looper。如果这个线程的Looper不存在,程序将抛出"Can't create handler inside thread that has not called Looper.prepare()"。 2. HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它自带一个封装好了的Looper成员变量。在其run()方法中,调用Looper.myLooper()获得一个looper对象。 3. HandlerThread的用处 创建Handler时指定的looper,也可以是别的线程创建的。所以Handler中MessageQueue的轮询不一定非要在创建Handler的线程进行,还可以在别的线程中进行。 这个时候我们就需要使用HandlerThread这个类的Looper,这样消息的处理就在新创建的HandlerThread中进行。 mThread = new HandlerThread("Handler Thread");//为新创建的线程指定一个名字,HandlerThread线程独有 mHandler = new Handler(mThread.getLooper()){ public void handleMessage(android.os.Message msg) {... }; };查看全部
-
主线程与子线程之间的信息交互查看全部
举报
0/150
提交
取消