Mus*_*sir 11 java android memory-leaks android-asynctask
我有一个Service我AsyncTask从一个给定的计时器开始做后台任务.我的需求需要短暂的网络任务,这就是我坚持的原因AsyncTask.
从AsyncTask我正在进行需要的多个操作(例如启动通知)Context.现在,当我初始化Context我AsyncTask我得到一个警告" 这个领域泄漏上下文对象. "
我已经看到了许多关于相同的问题,但它们都与之相关Activity/Fragment.所以我的问题是,如何Context在我的AsyncTask(顶级课程)中使用而不泄漏它?
您可以尝试使用a WeakReference和静态内部类AsyncTask来访问您尝试访问的对象.像这样的东西:
class MyServiceWhichDoesNotLeak extends Service {
View view;
AsyncTask task;
//Your onCreate and stuff
private static class BackgroundTask extends AsyncTask<Void, Void, String> {
private final WeakReference<View> viewReference;
public BackgroundTask(View view) {
this.viewReference = new WeakReference<>(view);
}
@Override
protected String doInBackground(Void... params) {
// Background stuff
return "something";
}
@Override
protected void onPostExecute(String result) {
View view = viewReference.get();
if (view != null) {
//Use your view
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个服务,我从给定的计时器启动 AsyncTask 以执行后台任务。
不要使用AsyncTask. 使用线程。或者,更好的是,用于ScheduledExecutorService计时组件,因为它将在后台线程上执行任务。AsyncTask是唯一适当的,因为当你需要做的主应用程序线程工作时的背景部分已经完成,而这很少与服务所需。
另外,请记住,一旦您的进程终止,您的计时器将停止工作。
所以我的问题是,如何在我的 AsyncTask(顶级类)中使用上下文而不泄漏它?
呼叫getApplicationContext()的Service和使用Context。
您可以在AsyncTask中传递WeakReference,例如:
public class MyAsynctask extends AsyncTask<Void, Void, Void> {
private WeakReference<Context> mWeakContext;
public MyAsynctask (WeakReference<Context> reference) {
mWeakContext = reference;
}
// when you need context use mWeakContext.get();
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
6154 次 |
| 最近记录: |