在非UI线程中使用Handler实现请求队列

Handler是Android中非常重要的类之一,通过Handler可以实现主线程的延时操作和线程之间的通信,通过在子类中的Handle、和Looper可以很轻松的实现一个请求队列。

在写代码之前首先简要的说一下 Handler、Looper、MessageQuene之间的关系。

每一个线程最多有一个Looper、一个Looper里边含有一个MessageQuene。

Handler每次将消息发送到MessageQuene中,Looper用过一个死循环不断的从MessageQuene中获取消息,获取后,根据Message的target分发给对应的Handler进行处理。

下边是我写的一个通过Handler和Looper实现的请求队列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package  com.hou.looper;
 
import  android.app.Activity;
import  android.os.Bundle;
import  android.os.Handler;
import  android.os.Looper;
import  android.util.Log;
 
public  class  DemoLooperActivity extends  Activity {
     private  MyThread myThread = new  MyThread();
 
     /** Called when the activity is first created. */
     @Override
     public  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.main);
 
         /*********** 模拟两个任务 ***********/
         postToNoneUIThread( new  Runnable() {
 
             @Override
             public  void  run() {
                 try  {
                     Log.e( "" , "5 start" );
                     Thread.sleep( 5000 );
                     Log.e( "" , "5 end" );
                 } catch  (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         });
         postToNoneUIThread( new  Runnable() {
 
             @Override
             public  void  run() {
                 try  {
                     Log.e( "" , "1 start" );
                     Thread.sleep( 1000 );
                     Log.e( "" , "1 end" );
                 } catch  (InterruptedException e) {
                     e.printStackTrace();
                 }
 
             }
         });
         /*********** 模拟两个任务OVER ***********/
 
     }
 
     public  void  runOnNoneUIThread(Runnable r) {
         new  Thread(r).start();
     }
 
     /**
      * 放入到子线程队列中
      * */
     public  void  postToNoneUIThread(Runnable r) {
         // 执行到这里的时候,子线程可能尚未启动,等待子线程启动,等待的时间会很短,
         while  (myThread.handler == null ) {
         }
         myThread.handler.post(r);
         myThread.handler.sendEmptyMessage( 100 );
     }
 
     /**
      * 可以设计为网络请求队列
      * */
     class  MyThread extends  Thread {
         {
             start(); // 类加载完成后直接启动
         }
         private  Handler handler;
 
         @Override
         public  void  run() {
             while  ( true ) {
 
                 Looper.prepare(); // 创建该线程的Looper对象
                 handler = new  Handler(Looper.myLooper()) {
                     public  void  handleMessage(android.os.Message msg) {
                         Log.i( "handleMessage" , ""  + msg.what);
                     };
                 };
 
                 Looper.loop(); // 这里是一个死循环
                 // 此后的代码无法执行
             }
         }
     }
}

转自:http://www.cnblogs.com/ihou/archive/2012/08/28/2660655.html

猜你喜欢

转载自chriszeng87.iteye.com/blog/2104031