你的位置:首页 > 操作系统

[操作系统]异步消息处理机制 简析

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;      }          }      }}