91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android省電的秘密之JobScheduler

發布時間:2020-09-28 10:20:28 來源:腳本之家 閱讀:142 作者:九九叔 欄目:移動開發

JobScheduler是Android L版本新引入的API,JobScheduler,顧名思義,是用來調度工作。工作被調度的條件包括網絡變化,充電插拔,周期執行等。使用場景包括wifi條件下數據下載上傳等等。谷歌為什么要引入這個新的API呢?是為了省電而制定的一種規范。想想如果每個開發者都利用這個API進行wifi網絡下數據上傳,數據上傳的操作將會被統一到同一個時間點,批量處理,這樣比許多應用單獨喚醒要省電的多。

下面展示一個小例子

主MainActivity

builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); 代表免費的網絡,通常就是指wifi了

public class MainActivity extends Activity {
 JobScheduler js;
 JobInfo.Builder builder;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  js=(JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
  builder=new Builder(1, new ComponentName(this, DemoService.class));
  builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
  js.schedule(builder.build());
 }
}

需要被調度的Job

當wifi可用時,這個DemoService 就會執行onStartJob

public class DemoService extends JobService{
 @Override
 public boolean onStartJob(JobParameters params) {
  // TODO Auto-generated method stub
  final JobParameters mJobParameters=params;
  AsyncTask<Void, Void, Void> mTask = new AsyncTask<Void, Void, Void>() {
  @Override
  protected Void doInBackground(Void... params) {
   // TODO Auto-generated method stub
   return null;
  }
  @Override
  protected void onPostExecute(Void result) {
   // TODO Auto-generated method stub
   Toast.makeText(wenfengService.this, "hello", 1000).show();
   jobFinished(mJobParameters, true);
   super.onPostExecute(result);
  }
  };
  mTask.execute();
  return true;
 }
 @Override
 public boolean onStopJob(JobParameters params) {
  // TODO Auto-generated method stub
  Toast.makeText(this, "bye", 1000).show();
  return true;
 }
}

清單

<service
 android:name=".DemoService "
android:permission="android.permission.BIND_JOB_SERVICE"
 android:exported="true"/>

Android省電的秘密之JobScheduler

onStartJob.png

onStartJob函數常常有兩種場景

1.不耗時的操作,這時你應該返回false

2.耗時的操作例如數據下載等,這是你應該開啟一個新線程(因為JobService是跑在主線程的),并且返回true

如果調度是任務執行失敗了,怎么辦?

任務失敗的情況有很多,例如下載失敗了,例如下載過程wifi斷掉了。

沒問題,google提供了方便的重新調度的方法。

例如如果下載過程中,wifi斷掉了,JobService會回調onStopJob函數,這是只需要把函數的返回值設置為true就可以了。當wifi重新連接后,JobService會重新回調onStartJob函數。

而如果下載失敗了,例如上面的例子中的AsyncTask執行失敗,怎么辦呢?我們只需要在AsyncTask的onPostExecute中執行jobFinished(mJobParameters, true),這里的true代表任務要在wifi條件重新滿足情況下重新調度。經典的寫法如下。

開始調度

@Override
public boolean onStartJob(final JobParameters params) {
 mDownloadArtworkTask = new DownloadArtworkTask(this) {
 @Override
 protected void onPostExecute(Boolean success) {
  jobFinished(params, !success);
 }
 };
 mDownloadArtworkTask.execute();
 return true;
}

停止調度

@Override
public boolean onStopJob(final JobParameters params) {
 if (mDownloadArtworkTask != null) {
 mDownloadArtworkTask.cancel(true);
 }
 return true;
}

如果調度的任務老是執行失敗,怎么辦?

為了省電的考慮,失敗的任務在執行條件滿足的情況下,要延時一段時間才能執行。而且隨著失敗次數的增多,延時會越長。舉個例子,因為wifi斷開而執行失敗的任務,在wifi連上后不會馬上執行,延時一段時間才能執行。

延時時間=30s*失敗次數。

下圖是JobScheduler在framework層的時序圖,下一章將用adb指令直觀查看JobScheduler的情況,不容錯過。有問題可以留言喲,大家一起探討!

Android省電的秘密之JobScheduler

JobScheduler內部時序圖

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丰镇市| 云安县| 定州市| 铅山县| 泰宁县| 天镇县| 台中市| 甘孜县| 江都市| 盐津县| 郓城县| 靖远县| 佛冈县| 灵武市| 彩票| 德化县| 都昌县| 老河口市| 邻水| 远安县| 宁波市| 安庆市| 德令哈市| 会宁县| 称多县| 浦县| 舟山市| 鄂伦春自治旗| 九台市| 广河县| 固镇县| 沈阳市| 施甸县| 淳安县| 三原县| 阿瓦提县| 平原县| 天长市| 钦州市| 班戈县| 乌苏市|