带生命周期的AsynsTask

13 篇文章 0 订阅

其中让我们吐槽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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值