国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

IntentService解析

2019-11-06 09:54:07
字體:
來源:轉載
供稿:網友
ServiceService 是長期運行在后臺的應用程序組件。Service 不是一個單獨的進程,它和應用程序在同一個進程中,Service 也不是一個線程,它和線程沒有任何關系,所以它不能直接處理耗時操作。如果直接把耗時操作放在 Service 的 onStartCommand() 中,很容易引起 ANR .如果有耗時操作就必須開啟一個單獨的線程來處理。IntentServiceIntentService 是繼承于 Service 并處理異步請求的一個類,在 IntentService 內有一個工作線程來處理耗時操作,啟動 IntentService 的方式和啟動傳統 Service 一樣,同時,當任務執行完后,IntentService 會自動停止,而不需要我們去手動控制。另外,可以啟動 IntentService 多次,而每一個耗時操作會以工作隊列的方式在IntentService 的 onHandleIntent 回調方法中執行,并且,每次只會執行一個工作線程,執行完第一個再執行第二個,以此類推。而且,所有請求都在一個單線程中,不會阻塞應用程序的主線程(UI Thread),同一時間只處理一個請求。 那么,用 IntentService 有什么好處呢?首先,我們省去了在 Service 中手動開線程的麻煩,第二,當操作完成時,我們不用手動停止 Service。IntentService源碼查看:public abstract class IntentService extends Service {    PRivate volatile Looper mServiceLooper;    private volatile ServiceHandler mServiceHandler;    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);        }    }    @Override    public void onCreate() {        super.onCreate();    //在此創建并開啟新的線程HandlerThread來處理耗時操作    //HandlerThread 繼承Thread 在其run方法中創建了一個Looper,初始化和啟動了一個線程,        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");        thread.start();    //返回的就是我們在run方法中創建的mLooper        mServiceLooper = thread.getLooper();    //與UI線程管理的handler        mServiceHandler = new ServiceHandler(mServiceLooper);    }    @Override    public void onStart(@Nullable Intent intent, int startId) {        Message msg = mServiceHandler.obtainMessage();        msg.arg1 = startId;        msg.obj = intent;       //發送處理消息        mServiceHandler.sendMessage(msg);    }    @Override    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {        onStart(intent, startId);        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;    }    @Override    public void onDestroy() {    //該方法實際上是調用了MessageQueue中的removeAllMessagesLocked,作用是將消息池中所有的消息全部清空        mServiceLooper.quit();    }    @Override    @Nullable    public IBinder onBind(Intent intent) {    //默認返回為null        return null;    }    @WorkerThread    //子類需要實現的接口    protected abstract void onHandleIntent(@Nullable Intent intent);}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 青河县| 湘乡市| 清河县| 惠东县| 伊吾县| 饶河县| 蕲春县| 甘南县| 新宁县| 玉树县| 上高县| 侯马市| 盐山县| 龙州县| 进贤县| 余江县| 新闻| 怀仁县| 丘北县| 甘南县| 福泉市| 隆化县| 峡江县| 汉寿县| 康乐县| 伊金霍洛旗| 泰和县| 随州市| 稻城县| 大悟县| 绥德县| 静宁县| 松潘县| 论坛| 平定县| 大理市| 舟山市| 平江县| 黑水县| 正安县| 晋宁县|