帶生命週期的AsynsTask

其中讓我們吐槽AsynsTask的一個點就是它生命週期無感知,在LifeCycle出來之前,一般都是在Activity/Fragment的onDestroy手動去掉,按照道理來說也可以,但是如果遇到一個界面有好多個AsynsTask,手動取消就不是那麼優雅了,看着在onDestroy裏一坨cancel方法,有種想砸鍵盤的衝動,但是AsynsTask已經封裝好了切換線程的操作,而且內部的實現原理還算是優雅。而當LifeCycle出來之後,生命週期這個問題就解決了,又能使用AsynsTask了/。具體代碼很簡單,如果使用過LifeCycle的話,看一眼便知。

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.Lifecycle.Event;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;
import android.os.AsyncTask;
import android.util.Log;

public abstract  class AsyncTaskLife<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> implements LifecycleObserver {

  public static final String TAG = "AsyncTaskLife";

  public AsyncTaskLife(Lifecycle lifecycle){
    lifecycle.addObserver(this);
  }

  @OnLifecycleEvent(Event.ON_CREATE)
  void onCreate(){
    Log.i(TAG,"task onCreate");
  }

  @OnLifecycleEvent(Event.ON_DESTROY)
  void onDestroy(){
     Log.i(TAG,"task onDestroy");
     cancel(true);
  }
}
public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new AsyncTaskLife<Void, Void, Void>(getLifecycle()) {
      @Override
      protected Void doInBackground(Void... voids) {
        try {
          Thread.sleep(5000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        return null;
      }

      @Override
      protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Toast.makeText(MainActivity.this,"toast",Toast.LENGTH_SHORT).show();
      }
    }.execute();

  }
}

上面的工具類完全能應付一般的使用,但有類人,看到註解就煩,看着簡潔,實際上是一把溫柔匕首。擼一邊LifeCycle的原理,也自己實現這個感知生命週期的功能。代碼庫:https://github.com/myjoybar/Android-lifecycle-listener

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章