发一下牢骚和主题无关:
Android供给了一个步异的消息调回机制Handler, 它责负发送消息和处置线程消息列队中的消息及runnable对象
Handler例实都是与一个线程和该线程的消息列队起一应用,一旦建创了一个新的handler例实,系统就把该例实与一个线程和该线程的消息列队捆绑起来,这将可以发送消息和runnable对象给该消息列队,并在消息列队出口处处置它们。
Handler认默应用前当的线程RunLoop, 但是也可以通过它的构造函数来指定某个线程的runloop, 或者应用专用的HandlerThread。
必须要注意的是, 应用Handler的线程中,必须实现了Runloop消息循环,否则会发生行运异常。
通常情况下,如果我们在主线程应用Handler, 则不须要我们动主去建创runloop, 因为android系统为动主为activity主线程建创一个runloop。
一样我们可以在一个殊特的子线程中应用Handler,而不必去建创runloop。这个殊特子线程就是HandlerThread, 查看其码源,我们可以发明,它也在run方法中实现了runloop。
上面就分析Handler的几种应用场景和用法:
1. 在主线程中应用Handler
主线程中应用Handler对相简略, 上面的示例代码实现了在主线程中建创Handler对象,动启一个runable方法去刷新进度条。代码如下:
//在主线程中建创一个Handler对象
Handler handler = new Handler() { public void handleMessage(Message msg) { firBar.setProgress(msg.arg1); handler.post(updateThread); Log.v("thread----", Thread.currentThread().getName()); } };
handler.post(updateThread);
//去行运
//建创一个runable去刷新进度条
Runnable updateThread = new Runnable() { @Override public void run() { // TODO Auto-generated method stub if ( i>= 100) { handler.removeCallbacks(updateThread); return; } i += 10; Message msg = handler.obtainMessage(); msg.arg1 = i; try { Thread.sleep(1000); //线程暂停1s } catch (InterruptedException e) { // TODO: handle exception e.printStackTrace(); } handler.sendMessage(msg); handler1.sendEmptyMessage(0); } };
2. 在通普的子线程中应用Handler
示例代码如下:
//建创一个子线程,在其中应用Handler class MyThread extends Thread { public void run() { Looper.prepare(); handler1 = new Handler()//Looper.getMainLooper() { public void handleMessage(Message msg) { Log.v("SubThread",Thread.currentThread().getName()); // 这里执行耗时作操,不会影响到UI主线程 for (int i = 0; i < 1000000000; i++) { } } }; Looper.loop(); } }
3. 在HandlerThread线程中应用Handler
HandlerThread handlerThread = new HandlerThread("handlerThread"); handlerThread.start(); //这里获取到HandlerThread的runloop MyHandler myHandler = new MyHandler(handlerThread.getLooper());
文章结束给大家分享下程序员的一些笑话语录: 《诺基亚投资手机浏览器UCWEB,资金不详或控股》杯具了,好不容易养大的闺女嫁外国。(心疼是你养的吗?中国创业型公司创业初期哪个从国有银行贷到过钱?)