-
为什么Handler需要和Looper关联,是因为Handler需要往Looper中的mQeueu里插入Message。所以,如果主线程需要和子线程之间通信,那有两个方法:<br> 1. 主线程拥有子线程的Handler(注意:子线程的Handler需要关联自己的Looper),通过该Handler发送消息即可。<br> 2. 主线程创建一个Handler,但是将子线程的Looper传递给Hander,这样Handler也是往子线程Looper对象的mQueue里插入msg,子线程Looper.loop自然可以拿到主线程消息了。<br> <br> 但是,这两种情况都有弊端。就是线程并发的时候,不能保证子线程的Handler或者Looper对象已经被初始化了。所以这个时候才需要用到HandlerThread查看全部
-
创建一个与线程相关的Handler: 1. 在线程中通过Looper.prepare()方法创建一个与线程相关的Looper对象; 2. 在线程中通过Handler的new关键字,创建一个Handler对象,这个对象在创建的时候会关联上1中创建的Looper对象 3. 调用Looper对象的loop()方法去轮询它的MessageQueue 4. 通过其他的线程拿到这个线程的Handler对象之后调用sendMessage()之后,在这个线程中就可以进行Message的处理了。<br> <br> 我们一般是在主线程中创建Handler对象,在主线程中处理Message,在子线程中调用这个Handler对象的sendMessage()来发送message。所以Handler是在哪个线程创建就有哪个线程处理Message和轮询,而由别的线程负责给这个Handler发送Message。 * 每个线程都对应一个looper,在线程里面创建的handler默认都会与这个looper对应 * 一个线程可以有多个handler与唯一的一个looper对应,有且只有一个looper * 这里主要是让我们熟悉在oncreat创建的handler与子线程创建handler * oncreate创建的handler他默认里面会有一个looper与之对应 * 所以我们自己在子线程中创建handler对象的时候我们应该要自主创建一个looper查看全部
-
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据,由MessageQueue同意列队,终由Handle处理 Handle:处理者,负责Message的接受和处理,使用Handle时,需要实现handleMessage(Message msg)方法对特定的Message进行处理,例如对UI更新等。 MessageQueue:消息队列,用来存放Handle发送过来的消息,并按照FIFO规则执行,当然,存放Message并非实际意义的保存,而是将Message以链表的方法串联起来的,等待Looper的抽取 Looper:消息泵。不断地从MessageQueue中抽取Message执行,因此,一个MessageQueue需要一个Looper。 Thread:线程,负责调整整个消息循环,及消息循环的执行场所查看全部
-
handler的原理查看全部
-
oogle为什么只设计了handler来解决更新ui的问题? 最根本的目的就是解决多线程并发问题,假设如果在一个Activity当中,有多个线程去更新ui,并且都没有加锁机制,那么就会出现更新界面错乱,但是如果都进行加锁处理的话,又会导致性能下降 因此,产生了这种handler的更新机制,根本不用去关心多线程的问题,所有的更新ui的操作,都是在主线程的消息队列当中去轮询处理的查看全部
-
1、使用Handler在子线程中向ui线程发送一个消息进行UI的更新; 2、创建一个Message; Message msg = new Message(); msg.arg1=88; 3、handler.sendMessage(msg); // 最终导致同一个handler对象的handleMessage()方法被创建Handler对象的线程(一般在主线程中创建)回调,然会这个传入的msg会被当成参数传给handleMessage()方法的。这个时候我们就可以对Message对象做一些处理了,而且这个时候我们所处的线程一般就在UI线程中了,所以这个时候我们更新UI就没有问题了。 msg.obj=xxx; 可以传递一个对象; 4、复用系统的message对象 Message msg = handler.obtainMessage(); // or Message.obtain(); msg.sendtoTarget(); 也可以发送到Handler对Message进行处理 handler.removeCallbacks(Runnable r); 如前面所说,我们除了在Handler对象的handleMessage()方法中处理Message对象,还可以在Handler对象创建的时候传入一个Callback对象,用这个Callback对象来处理Message对象;注意:callback接口中handleMessage(Message msg)中若截获则一定返回true;查看全部
-
1.Handler的用法:发送,移除,截获消息等功能 (1)可以在handler(Callback的接口中进行截获) 在handlerMessage方法中返回值为true时,消息被拦截, 不执行handler中的handlerMessage方法。 代码实现: private Handler handler = new Handler(new Callback(){ @Override public boolean handleMessage(Message msg){ Toast.makeText(getApplicationContext(),"" + 1, 1).show(); //return false; return true; } }){ public void handleMessage(Message msg){ Toast.makeText(getApplicationContext(),"" + 2, 1).show(); } };查看全部
-
Message对象可以通过handler.obtainMessage()方法获得,这个方法是Handler类的一个用于优化Message对象复用的方法,它的底层代码是判断程序中是否有一个Message对象,即if(message == null),如果为null,则会创建一个Message对象,否则直接将程序中有的Message对象复用给message。查看全部
-
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才可能会收到消息。查看全部
-
从上面的介绍我们知道,一个Handler实例其实绑定了一个关联的thread线程和那个线程的message queue;handler会讲message和runnable对象发送到它所关联的message queue中去,同时它也会执行从message queue中出来的message和runnable。<br> <br> Handler的两大用途:1. 在未来某个时间点执行message和runnable对象;2. 将要执行的action放到message queue中去,然后使得另外的不同的线程可以执行这个action。 Handler handler = new Handler(); // 创建Handler对象 通过Handler在自定义的子线程中更新UI,否则会抛出异常的。查看全部
-
new Thread() { public void run() { try { Thread.sleep(1000); handler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub // 更新文本信息 // 此时直接在这里更新ui的时候,程序将会直接崩溃掉 textView.setText("更新了"); } }); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }; }.start(); 从上面的方法中我们可以知道,如果想直接更新ui,我们需要在Thread的run方法中通过 handler.post()的方法来实现,而post方法中的参数是一个new Runnable(){public void run(){} ,然后我们在这个run方法中去更新ui,这才是正确的方法查看全部
-
handler是android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以通过它发送消息,也可以通过它处理消息 为什么要用hander,不用是否可行? 是不行的。android在设计的时候就封装了一套消息创建、传递、处理机制,如果不遵循这样的机制就没有办法更新UI信息的,就会抛出异常信息。 Handler主要作用有两个,一个是更新UI,另外一个是可以进行消息处理 02、handler怎么用? (1)sendMessage (2)sendMessageDelayed (3)post(Runnable) (4)postDelayed(Runnable, long) 03、为什么要用handler? (1)是不行的 (2)Android在设计的时候,就封装了一套消息创建、传递、处理机制,如果不遵循这样的机制的就没有办法更新UI信息的,就会抛出异常信息查看全部
-
Handler大纲 1、Handler是什么? 2、Handler怎么用? 3、为什么使用Handler? 如果我们从网上下载图片显示到控件中如何实现,需要使用Handler来辅助 4、Android为什么要设计只能通过Handler机制更新UI? 5、Handler的原理是什么? 6、使用Handler时候遇到的问题 7、如何实现一个与现场相关的Handler 8、HandlerThread又是什么? 9、如何在主线程给子线程发送消息? 10、Android中更新UI的几种方式查看全部
-
笔记查看全部
-
hahdler查看全部
举报
0/150
提交
取消