簡體   English   中英

將上下文從服務傳遞到異步任務而不泄漏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM