将上下文从Service传递到Asynctask而不泄漏它

时间:2017-08-12 17:37:46

标签: java android memory-leaks android-asynctask

我有一个Service,我从一个给定的计时器开始AsyncTask来执行后台任务。我的需求需要短暂的网络任务,这就是我坚持Asynctask的原因。

Asynctask我正在执行需要context的大量操作(例如启动通知)。现在,当我在context中初始化AsyncTask时,我收到警告“此字段会泄漏上下文对象。

我已经看到有关同一个问题的数量,但它们都与Activity/Fragment有关。所以我的问题是,如何在我的context(顶级课程)中使用AsyncTask而不泄露

3 个答案:

答案 0 :(得分:7)

您可以尝试使用SELECT * FROM posts WHERE id >= 3 AND ( id < (SELECT id FROM posts WHERE deleted = 'true' AND id > 3 ORDER BY id LIMIT 1) OR (SELECT id FROM posts WHERE deleted = 'true' AND id > 3 ORDER BY id LIMIT 1) IS NULL ) 和静态内部类,将WeakReference用于您要访问的对象。 像这样:

AsyncTask

答案 1 :(得分:6)

您可以在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();
}

希望这有帮助。

答案 2 :(得分:3)

  

我有一个服务,我从一个给定的计时器启动AsyncTask来执行后台任务。

不要使用AsyncTask。使用线程。或者,更好的是,使用ScheduledExecutorService作为计时组件,因为它将在后台线程上执行任务。 AsyncTask 适用于在后台部分完成时需要在主应用程序线程上工作的时间,并且服务很少需要这样做。

另外,请记住,一旦您的流程终止,您的计时器将停止工作。

  

所以我的问题是,如何在不泄漏的情况下在我的AsyncTask(顶级类)中使用上下文?

致电getApplicationContext()上的Service并使用Context