• Intentservice


     1     @Override
     2     public void onCreate() {
     3         // TODO: It would be nice to have an option to hold a partial wakelock
     4         // during processing, and to have a static startService(Context, Intent)
     5         // method that would launch the service & hand off a wakelock.
     6 
     7         super.onCreate();
     8         HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
     9         thread.start();
    10 
    11         mServiceLooper = thread.getLooper();
    12         mServiceHandler = new ServiceHandler(mServiceLooper);
    13     }
       private final class ServiceHandler extends Handler {
            public ServiceHandler(Looper looper) {
                super(looper);
            }
    
            @Override
            public void handleMessage(Message msg) {
                onHandleIntent((Intent)msg.obj);
                stopSelf(msg.arg1);
            }
        }
    1   protected abstract void onHandleIntent(Intent intent);
     1 public class HandlerThread extends Thread {
     2     private int mPriority;
     3     private int mTid = -1;
     4     private Looper mLooper;
     5 
     6     public HandlerThread(String name) {
     7         super(name);
     8         mPriority = Process.THREAD_PRIORITY_DEFAULT;
     9     }
    10     
    11     /**
    12      * Constructs a HandlerThread.
    13      * @param name
    14      * @param priority The priority to run the thread at. The value supplied must be from 
    15      * {@link android.os.Process} and not from java.lang.Thread.
    16      */
    17     public HandlerThread(String name, int priority) {
    18         super(name);
    19         mPriority = priority;
    20     }
    21     
    22     /**
    23      * Call back method that can be explicitly over ridden if needed to execute some
    24      * setup before Looper loops.
    25      */
    26     protected void onLooperPrepared() {
    27     }
    28 
    29     public void run() {
    30         mTid = Process.myTid();
    31         Looper.prepare();
    32         synchronized (this) {
    33             mLooper = Looper.myLooper();
    34             notifyAll();
    35         }
    36         Process.setThreadPriority(mPriority);
    37         onLooperPrepared();
    38         Looper.loop();
    39         mTid = -1;
    40     }
    41     
    42     /**
    43      * This method returns the Looper associated with this thread. If this thread not been started
    44      * or for any reason is isAlive() returns false, this method will return null. If this thread 
    45      * has been started, this method will block until the looper has been initialized.  
    46      * @return The looper.
    47      */
    48     public Looper getLooper() {
    49         if (!isAlive()) {
    50             return null;
    51         }
    52         
    53         // If the thread has been started, wait until the looper has been created.
    54         synchronized (this) {
    55             while (isAlive() && mLooper == null) {
    56                 try {
    57                     wait();
    58                 } catch (InterruptedException e) {
    59                 }
    60             }
    61         }
    62         return mLooper;
    63     }
    64     
    65     /**
    66      * Ask the currently running looper to quit.  If the thread has not
    67      * been started or has finished (that is if {@link #getLooper} returns
    68      * null), then false is returned.  Otherwise the looper is asked to
    69      * quit and true is returned.
    70      */
    71     public boolean quit() {
    72         Looper looper = getLooper();
    73         if (looper != null) {
    74             looper.quit();
    75             return true;
    76         }
    77         return false;
    78     }
    79     
    80     /**
    81      * Returns the identifier of this thread. See Process.myTid().
    82      */
    83     public int getThreadId() {
    84         return mTid;
    85     }
    86 }

    HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。这个Looper其实就是对消息队列以及队列处理逻辑的封装

  • 相关阅读:
    99%的Python用户都不知道的f-string隐秘技巧
    (数据科学学习手札115)Python+Dash快速web应用开发——交互表格篇(上)
    (数据科学学习手札114)Python+Dash快速web应用开发——上传下载篇
    (数据科学学习手札113)Python+Dash快速web应用开发——表单控件篇(下)
    (数据科学学习手札112)Python+Dash快速web应用开发——表单控件篇(上)
    (数据科学学习手札111)geopandas 0.9.0重要新特性一览
    .NET Core 下使用 Apollo 配置中心
    .NET Core 下的爬虫利器
    .NET Core 集成JWT认证
    .NET Core 下收发邮件之 MailKit
  • 原文地址:https://www.cnblogs.com/mingfeng002/p/3142161.html
Copyright © 2020-2023  润新知