当用户点击一个按钮时如果执行的是一个常耗时操作的话,处理不好会导致系统假死,用户体验很差,而Android则更进一步,如果任意一个Acitivity没有响应5秒钟以上就会被强制关闭,因此我们需要另外起动一个线程来处理长耗时操作,而主线程则不受其影响,在耗时操作完结发送消息给主线程,主线程再做相应处理。那么线程之间的消息传递和异步处理用的就是Handler。
下面是一个简单从web服务器端下载MP3文件的例子:
public class HandlerThreadTest extends Activity(){
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//查看当前线程的ID
System.out.println(Thread.currentThread().getName()+"---"+Thread.currentThread().getId());
//HandlerThread对象,内部已经实现循环处理消息的功能
HandlerThread handlerThread = new HandlerThread("handler-thread");
handlerThread.start();
System.out.println(Thread.currentThread().getName()+"---"+Thread.currentThread().getId());
//创建Handler
MyHandler handler = new MyHandler(handlerThread.getLooper());
//获取一个消息对象
Message msg = handler.obtainMessage();
msg.sendToTarget();
}
}
public class MyHandler extends Handler{
String urlPath="xxx";
public MyHandler(Looper looper){
super(looper);
}
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
loadMusic(urlPath);
}
public void loadMusic( String urlPath){
........
}
}