多線程的應用
- 繼承Thread類
- 實現(xiàn)Runnable接口
- AsyncTask
- Handler
- HandlerThread
- IntentService
實現(xiàn)步驟
步驟1:定義IntentService的子類:傳入線程名稱、復寫onHandleIntent()方法
步驟2:在Manifest.xml中注冊服務
步驟3:在Activity中開啟Service服務
package com.newbeeair.cleanser.services;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.joshdholtz.sentry.Sentry;
import com.kf5sdk.init.KF5SDKInitializer;
import com.newbeeair.cleanser.BuildConfig;
import com.newbeeair.cleanser.constants.AppConstants;
import com.newbeeair.cleanser.umeng.PushManager;
import com.newbeeair.cleanser.utils.DebugLog;
import com.newbeeair.cleanser.utils.PreferenceUtils;
import com.umeng.analytics.MobclickAgent;
import com.youzan.sdk.YouzanSDK;
import cn.sharesdk.framework.ShareSDK;
/**
* <pre>
* author : lzy
* e-mail : zanyang.lin@newbeeair.com
* time : 2017/07/11
* desc : 初始化IntentService
* </pre>
*/
public class InitService extends IntentService {
private static final String ACTION_INIT = "com.newbeeair.cleanser.action.init";
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public InitService() {
super("InitService");
}
public static void startInit(Context context) {
Intent intent = new Intent(context, InitService.class);
intent.setAction(ACTION_INIT);
context.startService(intent);
}
@Override
protected void onHandleIntent(Intent intent) {
DebugLog.e("initService onHandleIntent");
if (intent != null) {
final String action = intent.getAction();
if (ACTION_INIT.equals(action)) {
DebugLog.e(">>>>>>>>>>>>>>>>>>>>>>>>>>");
PreferenceUtils.initialize(this);
initYiChuangYun(this);
//initGrowingIO(this);
initUmengPush(this);
initFresco(this);
initSentry(this);
initYouzan(this);
initUmeng(this);
initShareSDK(this);
}
}
}
private void initShareSDK(Context context) {
ShareSDK.initSDK(context);
}
private void initGrowingIO(Context context) {
}
private void initFresco(Context context) {
Fresco.initialize(context);
}
private void initYiChuangYun(Context context) {
KF5SDKInitializer.initialize(context);
}
private void initUmengPush(Context context) {
PushManager.getInstance(context).registPushAgent();
}
private void initYouzan(Context context) {
YouzanSDK.init(context, AppConstants.YOUZAN_USERAGENT);
}
private void initSentry(Context context) {
Sentry.init(context, BuildConfig.SENTRY_DSN);
}
private void initUmeng(Context context) {
MobclickAgent.setDebugMode(false);// 測試模式
MobclickAgent.openActivityDurationTrack(false);// 禁止默認的頁面統(tǒng)計方式
MobclickAgent.enableEncrypt(true);// 日志加密
MobclickAgent.setScenarioType(context, MobclickAgent.EScenarioType.E_UM_NORMAL);// 場景設置
}
}
步驟2:在Manifest.xml中注冊服務
<service android:name=".services.InitService" />
區(qū)別
Service
Service 是長期運行在后臺的應用程序組件。
Service 不是一個單獨的進程,它和應用程序在同一個進程中黍衙,Service 也不是一個線程,它和線程沒有任何關(guān)系,所以它不能直接處理耗時操作。如果直接把耗時操作放在 Service 的 onStartCommand() 中誓焦,很容易引起 ANR .如果有耗時操作就必須開啟一個單獨的線程來處理
IntentService
IntentService 是繼承于 Service 并處理異步請求的一個類,在 IntentService 內(nèi)有一個工作線程來處理耗時操作着帽,啟動 IntentService 的方式和啟動傳統(tǒng) Service 一樣杂伟,同時,當任務執(zhí)行完后仍翰,IntentService 會自動停止赫粥,而不需要我們?nèi)ナ謩涌刂啤A硗庥杞瑁梢詥?IntentService 多次越平,而每一個耗時操作會以工作隊列的方式在IntentService 的 onHandleIntent 回調(diào)方法中執(zhí)行翠肘,并且齐饮,每次只會執(zhí)行一個工作線程,執(zhí)行完第一個再執(zhí)行第二個悼瘾,以此類推龟再。
而且书闸,所有請求都在一個單線程中,不會阻塞應用程序的主線程(UI Thread)利凑,同一時間只處理一個請求浆劲。 那么,用 IntentService 有什么好處呢哀澈?首先牌借,我們省去了在 Service 中手動開線程的麻煩,第二割按,當操作完成時膨报,我們不用手動停止 Service
源碼分析
// IntentService源碼中的 onCreate() 方法
@Override
public void onCreate() {
super.onCreate();
// HandlerThread繼承自Thread,內(nèi)部封裝了 Looper
//通過實例化andlerThread新建線程并啟動
//所以使用IntentService時不需要額外新建線程
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
//獲得工作線程的 Looper,并維護自己的工作隊列
mServiceLooper = thread.getLooper();
//將上述獲得Looper與新建的mServiceHandler進行綁定
//新建的Handler是屬于工作線程的现柠。
mServiceHandler = new ServiceHandler(mServiceLooper);
}
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
//IntentService的handleMessage方法把接收的消息交給onHandleIntent()處理
//onHandleIntent()是一個抽象方法院领,使用時需要重寫的方法
@Override
public void handleMessage(Message msg) {
// onHandleIntent 方法在工作線程中執(zhí)行,執(zhí)行完調(diào)用 stopSelf() 結(jié)束服務够吩。
onHandleIntent((Intent)msg.obj);
//onHandleIntent 處理完成后 IntentService會調(diào)用 stopSelf() 自動停止比然。
stopSelf(msg.arg1);
}
}
////onHandleIntent()是一個抽象方法,使用時需要重寫的方法
@WorkerThread
protected abstract void onHandleIntent(Intent intent);
- 總結(jié)
從上面源碼可以看出周循,IntentService本質(zhì)是采用Handler & HandlerThread方式:
通過HandlerThread單獨開啟一個名為IntentService的線程
創(chuàng)建一個名叫ServiceHandler的內(nèi)部Handler
把內(nèi)部Handler與HandlerThread所對應的子線程進行綁定
通過onStartCommand()傳遞給服務intent强法,依次插入到工作隊列中,并逐個發(fā)送給onHandleIntent()
通過onHandleIntent()來依次處理所有Intent請求對象所對應的任務