我有一个Service
,我从一个给定的计时器开始AsyncTask
来执行后台任务。我的需求需要短暂的网络任务,这就是我坚持Asynctask
的原因。
从Asynctask
我正在执行需要context
的大量操作(例如启动通知)。现在,当我在context
中初始化AsyncTask
时,我收到警告“此字段会泄漏上下文对象。”
我已经看到有关同一个问题的数量,但它们都与Activity/Fragment
有关。所以我的问题是,如何在我的context
(顶级课程)中使用AsyncTask
而不泄露?
答案 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
。