异步消息处理机制 简析

1。什么是异步消息处理?

答:对于普通的线程来说,执行完run()方法内的代码后线程就结束了。而异步消息处理线程是指:线程启动后会进入一个无限循环体之中,每执行一次,从线程内部的消息队列中取出一个消息,并回调相应的消息处理函数,执行完一个消息后则继续循环。如果消息队列为空,线程会暂停(一般也就是我们调用休眠方法),直到消息队列中又新的消息。

2.什么时候使用异步消息处理?

答:当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无响应,如果时间过长,程序还会挂掉。Handler就是把这些功能放到一个单独的线程里执行,与Activity互不影响。因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。

3.android中异步消息处理由四部分组成,Message,Handler,MessageQueue,Looper。

a.Message:

    Message是在线程中传递的消息,它可以在内部携带少量的信息,用于在不同的线程间交换数据。

b.Handle:

    Handle主要用于发送和处理消息。发送消息一般使用的是SendMessage()方法,而发送的消息经过一系列的处理后,最终会传到Handle的Message()方法中。

c.MessageQueue

    MessageQueue是消息队列的意思,主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程只会有一个MessageQueue对象。

d。Looper

   调用Looper中的loop()方法后,就会进入一个无限循环中,每当发现MessageQueue中存在的一条消息,就会将他取出,并传递到Hander的handleMessage()方法中。每个线程也都会有一个Looper对象

4.简单的例子:

public class MainActivity extends ActionBarActivity {
    
    public static final int UPDATE_TEXT=1;
    
    private Button button;
    
    private TextView text;
    
    private Handler handler=new Handler(){
        public void handleMessage(Message msg){
            switch (msg.what) {
            case UPDATE_TEXT:
                
                text.setText("Nice to meet you");
                
                break;

            default:
                break;
            }
        }
        
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = (Button)findViewById(R.id.change_text);
        text = (TextView)findViewById(R.id.text);
        
        ButtonListener listener=new ButtonListener();
        button.setOnClickListener(listener);
    }
    
    
    
    class ButtonListener implements OnClickListener{

        @Override
        public void onClick(View v) {
            
            switch (v.getId()) {
            case R.id.change_text:
                
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        
                        Message message=new Message();
                        message.what=UPDATE_TEXT;
                        handler.sendMessage(message);
                        
                    }
                }).start();
                
                break;

            default:
                break;
            }
            
        }
        
    }
}

 

posted @ 2015-05-17 16:44  千个太阳在手中  阅读(2123)  评论(0编辑  收藏  举报