Android-Service中執行新線程的幾種方式


大家都知道,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

吃完飯在寫...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM