zoukankan      html  css  js  c++  java
  • 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

    吃完饭在写...

  • 相关阅读:
    ES6-11学习笔记--正则表达式的扩展
    ES6-11学习笔记--字符串的扩展
    ES6-11学习笔记--Map
    ES6-11学习笔记--Set
    ES6-11学习笔记--Symbol
    final
    MySQL
    爬虫1
    laravel
    HTML学习
  • 原文地址:https://www.cnblogs.com/hxy0107/p/4555292.html
Copyright © 2011-2022 走看看