gpt4 book ai didi

android - 如何防止 JobService 使用的 AsyncTask 中的上下文泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 10:35:39 26 4
gpt4 key购买 nike

我需要做一些后台工作,这需要 JobService 中的上下文(我使用的是 Firebase JobDispatcher,因为我们支持 api 16+)我已经阅读了很多关于 JobService 和 AsyncTasks 的文章,但我如果您需要上下文,则找不到任何关于如何组合它们的好文章。

我的工作服务

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 类中的 jobService 属性正在泄漏上下文对象。我理解为什么如果你传递一个 Activity 或 Fragment 会出现这种情况,但这是一个 JobService,它应该存在直到我调用 jobFinished()。我做错了什么或者我可以忽略警告吗?

最佳答案

您不能忽略该警告。因为 AsyncWork 持有对 Context 的引用,所以 Context 在任务完成之前不能被 GC:Context内存泄漏。有两种解决方案:

  1. 使用长期存在的上下文,无论如何,应用程序上下文。
  2. 将异步任务的生命与其持有引用的上下文的生命联系起来:在 onPause 中取消它

关于android - 如何防止 JobService 使用的 AsyncTask 中的上下文泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45964247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com