直接上代码:
import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private static final String TAG = "xxxxxxxxxxxxx";
private Button btn1;
private Button btn2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
private void setupViews() {
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
fun1();
fun2();
fun3();
//fun4();
fun5();
}
});
}
// 打印顺序: before -- > run() -- > after
private void fun1 () {
Log.i(TAG, "before Main Thread : " + Thread.currentThread().getName()); // main
new Runnable(){
public void run () {
Log.i(TAG, "run() thread: " + Thread.currentThread().getName()); // main
}
}.run(); // 只调用run()的话,会在主线程中执行,而且是串行化执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i(TAG, "after Main Thread: " + Thread.currentThread().getName());
}
// 打印顺序: before -- > start() -- > after
private void fun2 () {
Log.i(TAG, "before Main Thread : " + Thread.currentThread().getName()); // main
new Thread(new Runnable(){
public void run () {
Log.i(TAG, "start() thread: " + Thread.currentThread().getName()); // Thread-xx
}
}).start(); // 调用start()的话,会和主线程分开并发执行,另起一条线程执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i(TAG, "after Main Thread: " + Thread.currentThread().getName());
}
// 打印顺序: before -- > after -- > Handler
// 可以看出,handler是和UI线程分开异步执行的。这里可以使用handler去执行某项比较费时的操作,然后异步更新UI线程。这也是handler的主要作用之一。
private void fun3() {
Log.i(TAG, "before Main Thread: " + Thread.currentThread().getName()); // main
Handler handler = new Handler();
handler.post(new Runnable(){
public void run () {
Log.i(TAG, "Handler thread: " + Thread.currentThread().getName()); // main
}
}); // 虽然也是在主线程中执行,当时会和主线程分开并发执行。实际上是把runnable对象放到队列中按照FIFO依次执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i(TAG, "after Main Thread: " + Thread.currentThread().getName());
}
// 使用handler去循环执行某项任务
private Handler handler;
private Runnable task = new Runnable() {
@Override
public void run() {
Log.i(TAG, "task thread: " + Thread.currentThread().getName()); // main
if (handler != null) {
handler.postDelayed(this, 1000L); // 继续循环
}
}
};
private void fun4() {
handler = new Handler();
handler.postDelayed(task, 1000L);
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
handler.removeCallbacks(task);
}
});
}
// 和HandlerThread配合使用,另起一条线程去执行队列中的Message
private volatile HandlerThread handlerThread;
private volatile Looper looper;
private volatile MyHandler myHandler;
// 自定义handler
private class MyHandler extends Handler {
public MyHandler(Looper looper) {
super(looper);
}
// 在这个方法里面去处理队列里面的一条条Message
@Override
public void handleMessage(Message msg) {
Log.i(TAG, "customized handler thread: " + Thread.currentThread().getName()); // 和HandlerThread的名称相同
Log.i(TAG, msg.toString());
}
}
private void fun5() {
// 初始化工作
handlerThread = new HandlerThread("my_handler_thread");
handlerThread.start();
looper = handlerThread.getLooper();
myHandler = new MyHandler(looper);
// 发送Message对象
Message msg = myHandler.obtainMessage();
msg.what = 100;
msg.arg1 = new Random().nextInt();
msg.obj = "obj value";
//myHandler.sendMessageAtTime(msg, 1000L);
myHandler.sendMessageDelayed(msg, 1000L);
//myHandler.sendMessage(msg);
}
}