原则:
1.ui改变必须在ui线程中执行。
2.耗时操作必须在子线程。
经典用法:
其他机制:其实都是调用Activity自己维护的Handler。
//为什么主线程的 MainLooper->MessageQueue.next() 没有阻塞卡死。
//Linux 机制,和 ActivityThread 机制。
1,epoll模型当没有消息的时候会epoll.wait,等待句柄写的时候再唤醒。
1.ui改变必须在ui线程中执行。
2.耗时操作必须在子线程。
经典用法:
--即,handler机制。
new Thread(new Runnable(){
public void run(){
myHandler.post();/myHandler.sendMessage(); //将子线程的处理,发送到主线程的 MessageQueue。在主线程的handlerMessage重写中,操作UI。
}
}).show();
//注: 子线程也可以创建消息的循环机制。
class childThread extends Thread{
Handler myHandler;
public void run(){
Looper.prepare();
myHandler = new Handler(){
handlerMessage(Message){
//进行的操作
}
};
myOtherOperation();
Looper.loop();// Loop开始建立并且开始堵塞进程 MessageQueue.next();
myOtherOperation();
}
public void myOtherOperation(){
//子线程中的别的操作。
}
}
childThread.myHandler.sendMessage(....);//主线程中使用handler对象。
其他机制:其实都是调用Activity自己维护的Handler。
// 1.
Activity.runOnUiThread(new Runnable(){public void run(){}});
// 2.
View.post(new Runnable(){public void run(){}});
// 3.
View.postDelayed(Runnable,long);
// 4.上面比较繁琐。异步任务类简化了这些处理
AsyncTask<> myAsync = new AsyncTask<>(){
public void doInBackground(){
}
}
//为什么主线程的 MainLooper->MessageQueue.next() 没有阻塞卡死。
//Linux 机制,和 ActivityThread 机制。
1,epoll模型当没有消息的时候会epoll.wait,等待句柄写的时候再唤醒。
2,所有的ui操作都通过handler来发消息操作。
1.handler机制是使用pipe来实现的
2.主线程没有消息处理时阻塞在管道的读端
3.binder线程会往主线程消息队列里添加消息,然后往管道写端写一个字节,这样就能唤醒主线程从管道读端返回,也就是说queue.next()会调用返回
4.dispatchMessage()中调用onCreate, onResume