今天学习Handler。
因为安卓是单线程模式,也就是说只能在主线程中进行更新UI等操作,而很多耗时操作如下载,网络传输等都应该放到一个子线程中,否则容易引起主线程因为耗时太久而被关闭的这样一个风险。而子线程和主线程之间通过Handler进行交流,因为子线程也会进行UI的更新,而规定UI 更新只能在主线程中,所以就只有通过一个特殊的异步处理机制Handler来达到我们想要的目的。
一、特点:
1.可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中,两个作用:
(1)安排消息或Runnable 在某个主线程中某个地方执行
(2)安排一个动作在不同的线程中执行
二、实例:
子线程是另一个线程,一般用Thread,而主线程与子线程之间通过Handler来交流。
public class MYhandler extends Activity {
Button button;
MyHandler myHandler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handlertest);
button = (Button) findViewById(R.id.b5);
myHandler = new MyHandler();
MyThread m = new MyThread();
new Thread(m).start();
}
// 接受消息,处理消息 ,此Handler会与当前主线程一块
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper L) {
super(L);
}
// 子类必须重写此方法,接受数据
@Override
public void handleMessage(Message msg) {
Log.d("MyHandler", "handleMessage。。。。。。");
super.handleMessage(msg);
// 此处可以更新UI
Bundle b = msg.getData();
String color = b.getString("color");
MYhandler.this.button.append(color);
}
}
class MyThread implements Runnable {
public void run() {
try {Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("thread。。。。。。。", "mThread。。。。。。。。");
Message msg = new Message();
Bundle b = new Bundle();// 存放数据
b.putString("color", "我的");
msg.setData(b);
MYhandler.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
}
}
}