大家都知道,service和activity都是運行在UI線程中,超時的數據讀取和網絡耗時等操作必須新建線程,下面說說service中執行新線程的幾種方式。
1.傳統的java方式
我們都知道 java中新建線程可以繼承Thread類,也可以implement Runnable接口。實質都是實現Runnable的run方法,此處底層應該是jvm識別run這個方法分配並且創建了線程。run方法只是准備好了新線程的資源,要調用
start() native方法才能啟動線程。
1 public interface Runnable { 2 3 /** 4 * Starts executing the active part of the class' code. This method is 5 * called when a thread is started that has been created with a class which 6 * implements {@code Runnable}. 7 */ 8 public void run(); 9 }
1 public class Thread implements Runnable
那么在service中也是一樣,我們可以用Thread類:
1 @Override 2 public int onStartCommand(Intent intent, int flags, int startId) { 3 L.e(TAG,"onStartCommand"); 4 new Thread(new Runnable() { 5 @Override 6 public void run() { 7 8 } 9 }).start(); 10 return super.onStartCommand(intent, flags, startId); 11 }
也可以實現Runnable接口:
1 Runnable runnable= new Runnable() { 2 @Override 3 public void run() { 4 L.e(TAG, "***********************"); 5 } 6 }; 7 @Override 8 public int onStartCommand(Intent intent, int flags, int startId) { 9 runnable.run(); 10 return super.onStartCommand(intent, flags, startId); 11 }
2.使用IntentService
具體見上篇博文http://www.cnblogs.com/hxy0107/p/4552486.html
3.使用HandleThread和Headler
handler本身不創建新線程,只是主UI線程和新線程通信的句柄,傳遞信息Message。在下次android進程通信中詳細說明。使用方式如下:
1 final Handler myHandler=new Handler(){ 2 3 @Override 4 public void handleMessage(Message msg) { 5 if(msg.what==0x123){ 6 L.e(TAG, "handleMessage"); 7 } 8 } 9 }; 10 @Override 11 public void onStart(Intent intent, int startId) { 12 13 L.e(TAG,"onStart"); 14 15 new Thread(new Runnable() { 16 @Override 17 public void run() { 18 myHandler.sendEmptyMessage(0x123); 19 } 20 }).start(); 21 super.onStart(intent, startId); 22 }
這種方式下創建的Handler它是在context上下文中創建的,所以是和UI主線程的Looper綁定的,消息序列message也是Ui的looper接收的。如果我們想讓Handler綁定在自己定義的線程上,那我們必須在新線程上創建消息序列Looper,好在android有了HandlerThread.HandlerThread本身只是個Thread,只是它內部實現了自己的消息序列looper,這樣其他的線程就可以和我們的新線程通過handler來通信啦~(handler必須綁定新線程的looper)
1 HandlerThread thread = new HandlerThread("MyHandlerThread"); 2 thread.start(); 3 mHandler = new Handler(thread.getLooper()); 4 mHandler.post(new Runnable(){...});
1 MyHandlerThread myHandlerThread; 2 @Override 3 public void onStart(Intent intent, int startId) { 4 5 L.e(TAG,"onStart"); 6 myHandlerThread=new MyHandlerThread("myhandlerThread"); 7 myHandlerThread.start(); 8 final Handler handlerelse=new Handler(myHandlerThread.getLooper()){ 9 10 @Override 11 public void handleMessage(Message msg) { 12 if(msg.what==0x111) { 13 L.e(TAG, "handlerelse handleMessage"); 14 } 15 super.handleMessage(msg); 16 } 17 }; 18 19 new Thread(new Runnable() { 20 @Override 21 public void run() { 22 handlerelse.sendEmptyMessage(0x111); 23 } 24 }).start(); 25 super.onStart(intent, startId); 26 }
上面新建了兩條線程,其中handlerThread線程具有looper,可以實現類似主UI線程和其他線程交互的操作。
4.定時性發送消息可以使用TimerTask,timerTast也是實現Runnable接口的方法,新建了線程定時發送消息。
1 new Timer().schedule(new TimerTask() { 2 @Override 3 public void run() { 4 myHandler.sendEmptyMessage(0x123); 5 } 6 },0,2000);
5.線程池ThreadPool與ThreadPoolExecutor
吃完飯在寫...