1 Handler的简单使用
注意:handler对线程的处理post,并不是启动了一个新的线程,而是在当前线程调用run方法。
1.1 当触发startbtn的方法后,每隔3秒打印一次日志;当endbtn被点击后,才不再循环打印日志。
public class HandlerActivity extends Activity{
private Button startbtn = null, endbtn = null;
// 创建一个handler对象
Handler handler = new Handler();
// 将要执行的操作写在线程对象的run方法中
Runnable updateThread = new Runnable() {
@Override
public void run() {
System.out.println("UpdateThread");
// 在此执行postDelayed或者post方法,循环工作
handler.postDelayed(updateThread, 3000);
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startbtn = (Button) findViewById(R.id.startbutton);
endbtn = (Button) findViewById(R.id.endbutton);
startbtn.setOnClickListener(new StartBtnListener());
endbtn.setOnClickListener(new EndBtnListener());
}
class StartBtnListener implements OnClickListener {
@Override
public void onClick(View v) {
// 调用handler的post方法,将要执行的线程对象添加到队列中
handler.post(updateThread);
}
}
class EndBtnListener implements OnClickListener {
@Override
public void onClick(View v) {
handler.removeCallbacks(updateThread);
}
}
}
1.2 将Handler与Progressbar结合,不断更新进度条
理解线程队列和消息队列
public class HandlerActivity extends Activity{
private ProgressBar bar = null;
private Button startbtn = null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startbtn = (Button) findViewById(R.id.startbutton);
startbtn.setOnClickListener(new StartBtnListener());
bar = (ProgressBar) findViewById(R.id.bar);
}
class StartBtnListener implements OnClickListener {
@Override
public void onClick(View v) {
bar.setVisibility(View.VISIBLE);
updateBarHandler.post(updateThread);
}
}
Handler updateBarHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
bar.setProgress(msg.arg1);
updateBarHandler.post(updateThread);
}
};
// 线程类, 该类使用匿名内部类的方式进行声明
Runnable updateThread = new Runnable() {
int i = 0;
@Override
public void run() {
System.out.println("Begin Thread");
i = i + 10;
// 得到一个消息对象,Message类是由android操作系统提供
Message msg = updateBarHandler.obtainMessage();
msg.arg1 = i; // 使用arg1成员变量传递参数
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
// 将msg对象加入到消息队列当中
updateBarHandler.sendMessage(msg);
if(i==100) {
System.out.println("thread end end end !");
updateBarHandler.removeCallbacks(updateThread);
}
}
};
}
2 通过HandlerThread和Handler实现新开线程处理msg,通过Bundle对象承载Msg的数据
通过HandlerThread获取Looper,交给Handler,从而实现Handler在新开线程中对msg的处理
public class HandlerActivity extends Activity{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("acitivty--->"+Thread.currentThread().getId());
System.out.println("activityName-->" + Thread.currentThread().getName());
HandlerThread handlerthread = new HandlerThread("new_thread");
handlerthread.start();
MyHandler myhandler = new MyHandler(handlerthread.getLooper());
Message msg = myhandler.obtainMessage();
msg.obj = "abc";
Bundle b = new Bundle();
b.putInt("age", 20);
b.putString("name", "jhon");
msg.setData(b);
msg.sendToTarget(); // 消息发送给目标对象,也就是调用obtainMessage方法的对象
// myhandler.sendMessage(msg);
}
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) { // 在新线程当中处理msg
System.out.println("handler---->"+Thread.currentThread().getId());
System.out.println("handleMessage " + msg.obj + msg.getData().getString("name"));
}
}
}