-
在子线程中更新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.子线程通过 HandlerThread的thread.getLooper()绑定, 2.在主线程的handler的handlerMessage中调用threadHandler.sendMessageDelay(msg,1000);向子线程发送消息。 3.在子线程中通过handler.sendMessageDelay(msg,1000);向主线程发送消息 4.在一个启动点btn调用主线程的handler.sendEmptyMessage(int x);查看全部
-
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) {... }; };查看全部
-
* 每个线程都对应一个looper,在线程里面创建的handler默认都会与这个looper对应 * 一个线程可以有多个handler与唯一的一个looper对应,有且只有一个looper * 这里主要是让我们熟悉在oncreat创建的handler与子线程创建handler * oncreate创建的handler他默认里面会有一个looper与之对应 * 所以我们自己在子线程中创建handler对象的时候我们应该要自主创建一个looper查看全部
-
handler原理查看全部
-
google为什么只设计了handler来解决更新ui的问题? 最根本的目的就是解决多线程并发问题,假设如果在一个Activity当中,有多个线程去更新ui,并且都没有加锁机制,那么就会出现更新界面错乱,但是如果都进行加锁处理的话,又会导致性能下降 因此,产生了这种handler的更新机制,根本不用去关心多线程的问题,所有的更新ui的操作,都是在主线程的消息队列当中去轮询处理的 图为handler原理查看全部
-
1.使用Handler的sendMessage()和handleMessage() handleMessage() private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { mTextView.setText("" + msg.arg1); }; }; 主线程中新建一个Thread发送message给主线程。 new Thread() { public void run() { Message message = handler.obtainMessage(); message.arg1 = 88; handler.sendMessage(message); }; }.start(); 2. 移除runnable对象 对应于handler.postDelayed(myRunnable, 2000);直接handler.removeCallbacks(myRunnable); 3. 截获message 在创建handler对象时,调用new Handler(Callback callback)方法。 private Handler handler = new Handler(new Callback() { public boolean handleMessage(Message msg) { return true; //return true就截获,return false不截获 } }){ public void handleMessage(Message msg) { } }; 在主线程中执行handler.sendEmptyMessage(1)。其原理: 当Handler收到message时,新创建的Callback将首先执行,其handleMessage()将会处理消息;如果Callback的handleMessage()不截获消息,然后Handler才可能会收到消息。查看全部
-
如果我们直接在一个Activity中new一个Thread,并在其中的run方法中去更新ui,那么此时这个程序是会直接崩溃掉的,也就是说,我们不能直接在非ui线程中去更新ui,需要使用到Handler的机制才能实现我们的效果 Handler的方法 sendMessage sendMessageDelayed post(Runnable) postDelayed(Runnable,long)查看全部
-
handler是android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以通过它发送消息,也可以通过它处理消息 为什么要用hander,不用是否可行? 是不行的。android在设计的时候就封装了一套消息创建、传递、处理机制,如果不遵循这样的机制就没有办法更新UI信息的,就会抛出异常信息。查看全部
-
Handler主要作用有两个,一个是更新UI,另外一个是可以进行消息处理查看全部
-
这章,好抽象。要好好理解下!查看全部
-
看截图查看全部
-
一句话说明handler与looper和messagequeue之间的关系查看全部
-
在子线程中创建Handler时必须与手动创建的Looper相关联,即new Handler(looper);查看全部
举报
0/150
提交
取消