我需要做一些背景工作,这需要在工作服务中的上下文(我正在使用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
内存泄漏。有两种解决方案:
- 无论如何,使用长期存在的上下文,即应用程序上下文。
- 将异步任务的寿命与所持参考的上下文的寿命联系起来:在
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);
}
}