handler是用于线程间发送消息和处理消息的。
1.最常用的方式是:
handler.sendMessage()、handler.sendEmptyMessage()、handler.sendMessageAtTime()、handler.sendMessageDelayed()等方法都是将消息发送到handler自己,它们的区别就是发送消息时是否延时,然后通过handler重写的handleMessage方法来处理。
在onCreate方法中,开启一个子线程,处理耗时操作,然后发送消息给handler处理,代码如下:
new Thread(new Runnable() {
@Override
public void run() {
//耗时操作 ...
mHandle.sendEmptyMessage(1);
}
}).start();
然后在handler实例化时,重写handleMessage方法,处理子线程发过来的消息:
private Handler mHandle = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
tvHandler.setText("handler.sendMessage" +1);
break;
default:
break;
}
}
};
2.handler.post(myRunnable)+runnable的方式处理
handler.post(myRunnable)、
handler.postDelayed(myRunnable,time)等方法,将消息交给runnable处理
mHandlerRunnable.postDelayed(myRunnable,1000);
定义handler和runnable
private Handler mHandlerRunnable = new Handler();
private Runnable myRunnable = new Runnable() {
@Override
public void run() {
tvRunnable.setText("runnable+handle.postdelayer"+1);
}
};
其实通过阅读源码发现,系统将runnable接口包装成Message,最终还是调用handler.sendMessage的方式处理。
3.通过runOnUiThread(new Runnable)的方式处理
private void updateUI(){
runOnUiThread(new Runnable() {
@Override
public void run() {
tvRunOnUi.setText("runOnUiThread"+1);
}
});
}
4.通过view.post(new Runnable)的方式处理
private void viewPost(){
tvViewPost.post(new Runnable() {
@Override
public void run() {
tvViewPost.setText("viewPost"+1);
}
});
}
通过handler.sendMessage的方式与TimerTask配合,周期性更新UI
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
myHandlerTimeTask.sendEmptyMessage(1);
}
};
timer.schedule(task,0,1000);
private Handler myHandlerTimeTask = new Handler(){
@Override
public void handleMessage(Message msg) {
tvTimeTask.setText("runnable+handle.postdelayer+timeTask"+title);
title++;
}
};
大家感兴趣的话,也可以尝试用handler.post(runnable)的方式周期性更新UI,注意用runnable,需要在onDestroy方法中调用mHandlerRunnable.removeCallbacks(myRunnable);
看效果图:
完整代码如下:
布局文件,一个LinearLayout,五个textview
activity代码:
package com.hw.yjg.testview;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class HandleDemoActivity extends AppCompatActivity {
private TextView tvHandler;
private TextView tvRunnable;
private TextView tvRunOnUi;
private TextView tvViewPost;
private TextView tvTimeTask;
private int title = 0;
//handleMessage + handler.sendMessage
private Handler mHandle = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 1:
tvHandler.setText("handler.sendMessage" +1);
break;
default:
break;
}
}
};
//Runnable + Handler.postDelayed(runnable,time)
private Handler mHandlerRunnable = new Handler();
private Runnable myRunnable = new Runnable() {
@Override
public void run() {
tvRunnable.setText("runnable+handle.postdelayer"+1);
}
};
private void updateUI(){
runOnUiThread(new Runnable() {
@Override
public void run() {
tvRunOnUi.setText("runOnUiThread"+1);
}
});
}
private void viewPost(){
tvViewPost.post(new Runnable() {
@Override
public void run() {
tvViewPost.setText("viewPost"+1);
}
});
}
//Handler.sendMessage+TimerTask
private Handler myHandlerTimeTask = new Handler(){
@Override
public void handleMessage(Message msg) {
tvTimeTask.setText("handle.sendMessage+timerTask"+title);
title++;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handle_demo);
tvHandler = (TextView) findViewById(R.id.tvHandler);
tvRunnable = (TextView) findViewById(R.id.tvRunnable);
tvRunOnUi = (TextView) findViewById(R.id.tvRunOnUiThread);
tvViewPost = (TextView) findViewById(R.id.tvViewPost);
tvTimeTask = (TextView) findViewById(R.id.tvTimeTask);
//1.子线程+handleMessage
new Thread(new Runnable() {
@Override
public void run() {
mHandle.sendEmptyMessage(1);
}
}).start();
//2.handler.post(myRunnable)+runnable
mHandlerRunnable.postDelayed(myRunnable,1000);
//3.runOnUiThread
updateUI();
//4.view.post(new Runnable)
viewPost();
/*Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTask(),0,500);*/
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
myHandlerTimeTask.sendEmptyMessage(1);
}
};
timer.schedule(task,0,1000);
}
@Override
protected void onDestroy() {
mHandlerRunnable.removeCallbacks(myRunnable);
super.onDestroy();
}
}