先庆祝一下终于放假啦,要升大三啦,痛苦的期末考试过去啦。。。。。
一、handler可以发送Message对象和Runnable对象到线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法是先把Runnable封装成一个Message(具体可看源码),再发送到消息队列中
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新
下面上示例代码:
package com.example.handler_03;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView textView;
private Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
textView.setText("ok 帅哥");
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView) findViewById(R.id.textview);
new Thread(){
public void run() {
// textView.setText("ok 帅哥");
//Handler handler = new Handler();// Can't create handler inside thread that has not called Looper.prepare()
//和我想的一样,yes
try {
Thread.sleep(2000);
//update2();
//updateUI();
viewUI();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
private void update1(){
handler.post(new Runnable() { //发送到到handler关联的线程
public void run() {
textView.setText("ok 帅哥");
}
});
}
private void update2(){
handler.sendEmptyMessage(1);
}
private void updateUI(){
runOnUiThread(new Runnable() { //实质一样,利用主线程handler.post(r),发送到住线程中
public void run() {
textView.setText("ok 帅哥");
}
});
}
private void viewUI(){
textView.post(new Runnable() {
public void run() {
textView.setText("ok 帅哥"); //实质和runOnUiThread方法一样
}
});
}
}
布局很简单,就一个textView,这就不上啦。
这个代码里包含了一些比较偏(自我感觉)的用法:
runOnUiThread(new Runnable())
textView.post(new Runnable())
二、需注意的问题:
在一个Thread中(除主线程之外)创建Handler时,必须引用Looper,否则会出现这个错误:
Can’t create handler inside thread that has not called Looper.prepare()
另外如果是自己给Thread创建Looper时,可能会遇到这个问题:
java.lang.NullPointerException
这是由于一个时间的问题,可以用下面这个方法避免:
private HandlerThread handlerThread = new HandlerThread("handler thread");
handlerThread.start();
handler = new Handler(handlerThread.getLooper()){//现成的Looper
@Override
public void handleMessage(Message msg) {
System.out.println("currentThread->"+Thread.currentThread());
}
};