安卓线程相关 HandlerThread Handler Thread Looper Message Runnable
生活随笔
收集整理的這篇文章主要介紹了
安卓线程相关 HandlerThread Handler Thread Looper Message Runnable
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文由PurpleSword(jzj1993)原創(chuàng),轉(zhuǎn)載請注明 原文網(wǎng)址 http://blog.csdn.net/jzj1993
安卓主線程(UI線程)是線程不安全的:對UI控件的操作都應(yīng)在主線程中完成;UI線程不應(yīng)執(zhí)行耗時操作,以免程序不響應(yīng)(即ANR異常)
實現(xiàn)新線程的常用方法(注意要調(diào)用start方法啟動新線程而不是run方法):
一、定義類,實現(xiàn)Runnable接口
? ??class?MyRunnable?implements?Runnable?{ ????????/** ?????????*?實現(xiàn)接口的run方法 ?????????*/ ????????@Override ????????public?void?run()?{ ????????????// run方法的中程序體將在新線程中執(zhí)行 ????????} ????} ? ??new?Thread(new?MyRunnable()).start();
二、簡潔寫法
? ? ? ??new?Thread(new?Runnable()?{ ????????????@Override ????????????public?void?run()?{ ????????????????//?新線程操作 ????????????} ????????}).start();
三、定義類,繼承Thread(不推薦):
? ??class?MyThread?extends?Thread?{ ????????/** ?????????*?覆寫run方法 ?????????*/ ????????@Override ????????public?void?run()?{ ????????????//?新線程操作 ????????} ????} ????new?MyThread().start();
Thread和Runnable關(guān)系
? ??public?class?Thread?extends?Object?implements?Runnable { ????}
創(chuàng)建UI線程/主線程的Handler
一、(推薦寫法,用于不處理消息,只是接收Runnable的情況下)
? ??// 無參數(shù)實例化時,會創(chuàng)建當(dāng)前正在運行線程(即主線程)的Handler ? ? Handler?handler?=?new?Handler();
如果handler需要處理消息,按照以下寫法將會產(chǎn)生警告This Handler class should be static or leaks might occur。此時可使用方法二)
????Handler?handler?=?new?Handler()?{ ????????@Override ????????public?void?handleMessage(Message?msg)?{ ????????????switch?(msg.what)?{ ????????????} ????????} ????};
二、(缺點在于需要定義一個新的類,寫起來比較麻煩)
? ??// 無參數(shù)實例化時,會創(chuàng)建當(dāng)前正在運行線程(即主線程)的Handler ? ??private?Handler?handler?=?new?MyHandler()?{ ????????//?處理其他線程發(fā)送的消息 ????????@Override ????????public?void?handleMessage(Message?msg)?{ ????????????Log.d("msg",?"msg?what?=?"?+?msg.what); ????????????switch?(msg.what)?{ ????????????} ????????} ????};
????protected?static?class?MyHandler?extends?Handler?{ ????}
三、(推薦寫法,可用于接收Runnable和處理消息的情況下)
? ??boolean?handleMessage(Message?msg)?{ ????????switch?(msg.what)?{ ????????} ????????return?true; ????}
? ??private?final?Handler?mainHandler?=?new?Handler(Looper.getMainLooper(), ????????????new?Handler.Callback()?{ ? ? ? ? ? ? ? ??@Override ????????????????public?boolean?handleMessage(Message?msg)?{ ????????????????????return?ActivityMain.this.handleMessage(msg); ????????????????} ????????????});
在UI線程中執(zhí)行程序
? ? ? ??handler.post(new?Runnable(){ ????????????@Override ????????????public?void?run()?{ ????????????????// 操作UI控件等... ????????????} ????????});
創(chuàng)建新線程的Handler
? ??private?HandlerThread?handlerThread; ????private?Handler?handler;
? ??this.handlerThread?=?new?HandlerThread(getClass().getSimpleName()); ????this.handlerThread.start(); ????this.handler?=?new?Handler(this.handlerThread.getLooper(), ????????????new?Handler.Callback()?{ ????????????????public?boolean?handleMessage(Message?msg)?{ ????????????????????return?NewThread.this.handleMessage(msg); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? });
? ??/** ?????*?處理消息 ?????*? ?????*?@param?msg ?????*?@return ?????*/ ????private?boolean?handleMessage(Message?msg)?{ ????????switch?(msg.what)?{ ????????} ????????return?true; ????}
通過Message進行線程間通信:在任意線程中向其他線程Handler發(fā)送消息
? ??/** ?????*?向線程Handler發(fā)送消息 ?????*? ?????*?@param?id ?????*?@param?o ?????*/ ????protected?void?sendMsg(int?id,?Object?o)?{ ????????if?(handler?!=?null)?{ ????????????Message?msg?=?Message.obtain(); ????????????msg.obj?=?o; ????????????msg.what?=?id; ????????????handler.sendMessage(msg); ????????} ????}
? ??/** ?????*?向線程Handler發(fā)送消息 ?????*? ?????*?@param?what ?????*/ ????protected?void?sendMsg(int?what)?{ ????????if?(handler?!=?null)?{ ????????????handler.sendEmptyMessage(what); ????????} ????}
? ??handler.sendMessageDelayed(msg,?milliseconds);
? ? Message.obtain(handler,?what,?obj).sendToTarget();
近期自己搭建了一個網(wǎng)站,以后我的博客會轉(zhuǎn)移到個人網(wǎng)站,歡迎大家關(guān)注~ 網(wǎng)址是http://purplesword.info
安卓主線程(UI線程)是線程不安全的:對UI控件的操作都應(yīng)在主線程中完成;UI線程不應(yīng)執(zhí)行耗時操作,以免程序不響應(yīng)(即ANR異常)
實現(xiàn)新線程的常用方法(注意要調(diào)用start方法啟動新線程而不是run方法):
一、定義類,實現(xiàn)Runnable接口
? ??class?MyRunnable?implements?Runnable?{ ????????/** ?????????*?實現(xiàn)接口的run方法 ?????????*/ ????????@Override ????????public?void?run()?{ ????????????// run方法的中程序體將在新線程中執(zhí)行 ????????} ????} ? ??new?Thread(new?MyRunnable()).start();
二、簡潔寫法
? ? ? ??new?Thread(new?Runnable()?{ ????????????@Override ????????????public?void?run()?{ ????????????????//?新線程操作 ????????????} ????????}).start();
三、定義類,繼承Thread(不推薦):
? ??class?MyThread?extends?Thread?{ ????????/** ?????????*?覆寫run方法 ?????????*/ ????????@Override ????????public?void?run()?{ ????????????//?新線程操作 ????????} ????} ????new?MyThread().start();
Thread和Runnable關(guān)系
? ??public?class?Thread?extends?Object?implements?Runnable { ????}
創(chuàng)建UI線程/主線程的Handler
一、(推薦寫法,用于不處理消息,只是接收Runnable的情況下)
? ??// 無參數(shù)實例化時,會創(chuàng)建當(dāng)前正在運行線程(即主線程)的Handler ? ? Handler?handler?=?new?Handler();
如果handler需要處理消息,按照以下寫法將會產(chǎn)生警告This Handler class should be static or leaks might occur。此時可使用方法二)
????Handler?handler?=?new?Handler()?{ ????????@Override ????????public?void?handleMessage(Message?msg)?{ ????????????switch?(msg.what)?{ ????????????} ????????} ????};
二、(缺點在于需要定義一個新的類,寫起來比較麻煩)
? ??// 無參數(shù)實例化時,會創(chuàng)建當(dāng)前正在運行線程(即主線程)的Handler ? ??private?Handler?handler?=?new?MyHandler()?{ ????????//?處理其他線程發(fā)送的消息 ????????@Override ????????public?void?handleMessage(Message?msg)?{ ????????????Log.d("msg",?"msg?what?=?"?+?msg.what); ????????????switch?(msg.what)?{ ????????????} ????????} ????};
????protected?static?class?MyHandler?extends?Handler?{ ????}
三、(推薦寫法,可用于接收Runnable和處理消息的情況下)
? ??boolean?handleMessage(Message?msg)?{ ????????switch?(msg.what)?{ ????????} ????????return?true; ????}
? ??private?final?Handler?mainHandler?=?new?Handler(Looper.getMainLooper(), ????????????new?Handler.Callback()?{ ? ? ? ? ? ? ? ??@Override ????????????????public?boolean?handleMessage(Message?msg)?{ ????????????????????return?ActivityMain.this.handleMessage(msg); ????????????????} ????????????});
在UI線程中執(zhí)行程序
? ? ? ??handler.post(new?Runnable(){ ????????????@Override ????????????public?void?run()?{ ????????????????// 操作UI控件等... ????????????} ????????});
創(chuàng)建新線程的Handler
? ??private?HandlerThread?handlerThread; ????private?Handler?handler;
? ??this.handlerThread?=?new?HandlerThread(getClass().getSimpleName()); ????this.handlerThread.start(); ????this.handler?=?new?Handler(this.handlerThread.getLooper(), ????????????new?Handler.Callback()?{ ????????????????public?boolean?handleMessage(Message?msg)?{ ????????????????????return?NewThread.this.handleMessage(msg); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? });
? ??/** ?????*?處理消息 ?????*? ?????*?@param?msg ?????*?@return ?????*/ ????private?boolean?handleMessage(Message?msg)?{ ????????switch?(msg.what)?{ ????????} ????????return?true; ????}
通過Message進行線程間通信:在任意線程中向其他線程Handler發(fā)送消息
? ??/** ?????*?向線程Handler發(fā)送消息 ?????*? ?????*?@param?id ?????*?@param?o ?????*/ ????protected?void?sendMsg(int?id,?Object?o)?{ ????????if?(handler?!=?null)?{ ????????????Message?msg?=?Message.obtain(); ????????????msg.obj?=?o; ????????????msg.what?=?id; ????????????handler.sendMessage(msg); ????????} ????}
? ??/** ?????*?向線程Handler發(fā)送消息 ?????*? ?????*?@param?what ?????*/ ????protected?void?sendMsg(int?what)?{ ????????if?(handler?!=?null)?{ ????????????handler.sendEmptyMessage(what); ????????} ????}
? ??handler.sendMessageDelayed(msg,?milliseconds);
? ? Message.obtain(handler,?what,?obj).sendToTarget();
近期自己搭建了一個網(wǎng)站,以后我的博客會轉(zhuǎn)移到個人網(wǎng)站,歡迎大家關(guān)注~ 網(wǎng)址是http://purplesword.info
總結(jié)
以上是生活随笔為你收集整理的安卓线程相关 HandlerThread Handler Thread Looper Message Runnable的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓json的解析
- 下一篇: LTE与VOLTE基础知识