- 后台进行 单线程 / 多线程 运算,前台显示progressBar / progressDialog,用Thread+Handler / ExecutorService / AsyncTask.
- Handler的所在线程,由new Handler时调用的looper的所在线程决定。这就是为什么在UI线程中创建的handler会接收UI线程的消息队列;如果将该handler的初始化使用另一线程的looper(如HandlerThread.getLooper),那么该线程执行handleMessage时就是在另一线程中。
- 子线程结束,父线程才销毁
- 不论是Handler.post 还是 Handler.sendmessage 最后都是由MessageQueue.enqueueMessage来加入Handler的Looper的MessageQueue。数据结构是单向链表,插入算法是根据加入队列的延迟时间(方法中的一个参数)来插入到延迟比插入message大的messages中延迟最小的message之前。不带参数则是插入到队列头。
- 由于智能卡内的apdu发送是单线程的服务且包含一个缓冲队列,所以访问智能卡的外部方法需要用多线程异步发送远程调用方法。进行下一个远程方法发送之前,最好要根据sleep一段时间,使得卡片的apdu交互结束,再启动新的线程执行下一个远程方法。
- 不要用一个循环来对卡片进行远程调用,否则只能进行一次循环;必须要用多线程的异步调用。
package com.tisson;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
public class AndroidTestActivity extends Activity {
private Thread t;
private ClassHandler handler = new ClassHandler();
class ClassHandler extends Handler {
public void handleMessage(Message msg) {
log("Activity:"+Thread.currentThread().getName());
new Thread(new MyThread()).start();
}
}
class MyThread implements Runnable {
class MyHandler extends Handler {
public void handleMessage(Message msg) {
log("Thread:"+Thread.currentThread().getName());
}
}
public void run() {
if (t.isAlive()) {
log("alive");
} else {
log("dead");
}
// Looper.prepare();
handler.sendEmptyMessage(0);
// new MyHandler().sendEmptyMessage(0);
// Looper.loop();
}
};
private void log(String info) {
Log.e(AndroidTestActivity.class.getSimpleName(), info);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
log("onCreate:"+Thread.currentThread().getName());
t = new Thread(new MyThread());
t.start();
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// // TODO Auto-generated method stub
// log("Thread:"+Thread.currentThread().getName());
// }
// }).start();
}
}