异步消息处理机制 简析
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; } } } }