其中让我们吐槽AsynsTask的一个点就是它生命周期无感知,在LifeCycle出来之前,一般都是在Activity/Fragment的onDestroy手动cancel,按照道理来说也可以,但是如果遇到一个界面有好多个AsynsTask,手动cancel就不是那么优雅了,看着在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