本文共 1207 字,大约阅读时间需要 4 分钟。
原则: 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
转载地址:http://gdegi.baihongyu.com/