IntentService的使用
在安卓實際開發中,我們經常會遇到一些耗時操作,如請求網路,儲存,android 提供了AsyncTask,可是這種不好的地方
有些同學可能認為一個在Activity中的AsyncTask會隨著Activity的銷燬而銷燬。但AsyncTask會一直執行doInBackground()方法直到方法執行結束。一旦上述方法結束,會依據情況進 行不同的操作。
•如果cancel(boolean)呼叫了,則執行onCancelled(Result)方法
•如果cancel(boolean)沒有呼叫,則執行onPostExecute(Result)方法
所以activity的ondestroy()必須cancle掉asyncTask的任務
private InitDataAsyncTask mInitDataAsyncTask; private class InitDataAsyncTask extends AsyncTask<Void,Void,Void> { @Override protected Void doInBackground(Void... params) { fetchDataFromDataBase(); return null; } @Override protected void onPostExecute(Void aVoid) { mTipView.hideView(); updateHealthLayout(); initAdapterForFragment(); } } public void ondestroy(){ super.ondestroy(); if(mInitDataAsyncTask != null) { mInitDataAsyncTask.cancel(true); } }
所以不需要執行回撥的情況下使用intentService是非常合適的
IntentService是繼承並處理非同步請求的一個類,在IntentService內有一個工作執行緒來處理耗時操作,啟動IntentService的方式和啟動傳統的Service一樣,同時,當任務執行完後,IntentService會自動停止,而不需要我們手動去控制或stopSelf()。另外,可以啟動IntentService多次,而每一個耗時操作會以工作佇列的方式在IntentService的onHandleIntent回撥方法中執行,並且,每次只會執行一個工作執行緒,執行完第一個再執行第二個。Intent服務開啟後,執行完onHandleIntent裡面的任務就自動銷燬結束,透過列印的執行緒名稱可以發現是新開了一個執行緒來處理耗時操作的,即是耗時操作也可以被這個執行緒管理和執行,同時不會產生ANR的情況。
那麼如何寫一個intentService呢:
public class PedometerIntentService extends IntentService { private static final String SERVICE_NAME = "PedometerIntentService"; private static final String BOOLEAN_VALUE = "boolean_value"; private static final String INT_VALUE = "int_value"; private static final String TAG = PedometerIntentService.class.getSimpleName(); public PedometerIntentService() { super(SERVICE_NAME); } public static void startService(Context context, String action) { try{ Intent intent = new Intent(action); intent.setClass(context,PedometerIntentService.class); context.startpService(intent); }catch (Exception ex) { ex.printStackTrace(); MonitorUtil.reportError(context,ex); } } @Override protected void onHandleIntent(@Nullable Intent intent) { if (intent == null) return; int value = 0; try{ switch (intent.getAction()) { case PemometerConstant.PEDOMETER_EXECUTE_GET_RECOMMEND_SPORT_TARGET_ACTION: LogUtil.d(TAG,"pedometer_execute_get_recommend_sport_target_action task execute"); getRecommendSportTask(); break; case PemometerConstant.PEDOMETER_EXECUTE_GET_RED_PACKAGE_ACTION: boolean shouldShowRedPackageInNotification = intent.getBooleanExtra(BOOLEAN_VALUE,false); LogUtil.d(TAG,"pedometer_execute_get_red_package_target_action execute flag="+shouldShowRedPackageInNotification); PedometerUtils.notifyredPackageChanged(this,shouldShowRedPackageInNotification ? 1 : 0); break; } }catch (Exception ex) { MonitorUtil.reportError(this,ex); ex.printStackTrace(); } } private void getRecommendSportTask() { } }
呼叫方法是
PedometerIntentService.startService(mContext, PemometerConstant.PEDOMETER_EXECUTE_GET_RECOMMEND_SPORT_TARGET_ACTION);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2144/viewspace-2818284/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android IntentService 的使用和解析AndroidIntent
- 理解 IntentService 原理Intent
- IntentService,用完即走Intent
- 淺談IntentService原理分析Intent
- HandlerThread和IntentService原始碼解析threadIntent原始碼
- Android中IntentService原始碼分析AndroidIntent原始碼
- Android面試相關 - IntentServiceAndroid面試Intent
- Android後臺任務(HandlerThread、AsyncTask、IntentService)AndroidthreadIntent
- 2018.03.16、Android-IntentService學習筆記AndroidIntent筆記
- Android四大元件之Service,以及IntentServiceAndroid元件Intent
- Android Service和IntentService知識點詳細總結AndroidIntent
- 看完這一篇,再也不怕面試官問到IntentService的原理面試Intent
- App 冷啟動緩慢出現白屏之終極解決方案 — IntentService 高效非同步處理APPIntent非同步
- Scrapy框架的使用之Scrapyrt的使用框架
- ActiveMQ的使用及整合spring的使用例項MQSpring
- Docker框架的使用系列教程(四)容器的使用Docker框架
- Urllib庫的使用一---基本使用
- ECharts的使用Echarts
- DbVisualizer的使用
- Typeof的使用
- iview 的使用View
- Trait 的使用AI
- lombok的使用Lombok
- MybatisGenerator的使用MyBatis
- valueForKeyPath的使用
- ThreadLocal的使用thread
- elasticsearch的使用Elasticsearch
- CoreData的使用
- joomla的使用OOM
- sqlmap的使用SQL
- echars的使用
- SVG 的使用SVG
- FlowableAPI的使用API
- pycnblog的使用
- netcat的使用
- jextract的使用
- pinia的使用
- pip 的使用