如何防止Jobservice使用的异步性上下文泄漏



我需要做一些背景工作,这需要在工作服务中的上下文(我正在使用firbase jobdispatcher,因为我们支持API 16 )工作服务和异步措施,但如果您需要上下文,我找不到有关如何结合它们的好文章。

我的工作服务

import com.firebase.jobdispatcher.JobParameters;
import com.firebase.jobdispatcher.JobService;
public class AsyncJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters job) {
        new AsyncWork(this, job).execute();
        return true;
    }
    @Override
    public boolean onStopJob(JobParameters job) {
        return false;
    }
}

我的异步症

import android.os.AsyncTask;
import com.firebase.jobdispatcher.JobParameters;
import com.firebase.jobdispatcher.JobService;
class AsyncWork extends AsyncTask<Void, Void, Void> {
    private JobService jobService;
    private JobParameters job;
    AsyncWork(JobService jobService, JobParameters job) {
        this.jobService = jobService;
        this.job = job;
    }
    @Override
    protected Void doInBackground(Void... voids) {
        // some work that needs context
        return null;
    }
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        // some work that needs context
        jobService.jobFinished(job, false);
    }
}

这给出了一个警告,即ASYNCWORK类中的工作岗位属性正在泄漏上下文对象。我知道,如果您通过一个活动或碎片,为什么会这样,但这是一个工作服务,直到我称为Jobfined()。我是做错了什么还是可以忽略警告?

您不能忽略警告。由于AsyncWork保留对Context的引用,因此在任务完成之前,Context不能被GCED:Context内存泄漏。有两种解决方案:

  1. 无论如何,使用长期存在的上下文,即应用程序上下文。
  2. 将异步任务的寿命与所持参考的上下文的寿命联系起来:在onPause中取消

要处理泄漏,您需要使用jobservice object

使用feekRefernce类
class AsyncWork extends AsyncTask<Void, Void, Void> {
  private WeakReference<JobService> jobServiceWeakReference;
  private JobParameters job;
  AsyncWork(JobService jobService, JobParameters job) {
      this.jobServiceWeakReference = new WeakReference<>(jobService);
      this.job = job;
  }
  @Override
  protected Void doInBackground(Void... voids) {
      // some work that needs context
        return null;
    }
  @Override
  protected void onPostExecute(Void aVoid) {
      super.onPostExecute(aVoid);
      // some work that needs context
      jobServiceWeakReference.get().jobFinished(job, false);
  }
}

相关内容

  • 没有找到相关文章

最新更新