其中讓我們吐槽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