[英]Passing context from Service to Asynctask without leaking it
我有一個Service
,我從給定的計時器啟動AsyncTask
以執行后台任務。 我的需求需要短暫的網絡任務,這就是我堅持使用Asynctask
的原因。
從Asynctask
我正在做一些需要context
的操作(例如啟動通知)。 現在,當我在我的AsyncTask
初始化context
,我收到一條警告“這個字段泄漏了一個上下文對象。 ”
我已經看到許多關於相同的問題,但它們都與Activity/Fragment
。 所以我的問題是,如何在我的AsyncTask
(頂級類)中使用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();
}
希望這會有所幫助。
您可以嘗試將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
}
}
}
}
我有一個服務,我從給定的計時器啟動 AsyncTask 以執行后台任務。
不要使用AsyncTask
。 使用線程。 或者,更好的是,使用ScheduledExecutorService
作為計時組件,因為它將在后台線程上執行任務。 AsyncTask
僅適用於在后台部分完成后需要在主應用程序線程上進行工作的情況,而服務很少需要這種情況。
另外,請記住,一旦您的進程終止,您的計時器將停止工作。
所以我的問題是,如何在我的 AsyncTask(頂級類)中使用上下文而不泄漏它?
在Service
上調用getApplicationContext()
並使用該Context
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.