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

Mus*_*sir 11 java android memory-leaks android-asynctask

我有一个ServiceAsyncTask从一个给定的计时器开始做后台任务.我的需求需要短暂的网络任务,这就是我坚持的原因AsyncTask.

AsyncTask我正在进行需要的多个操作(例如启动通知)Context.现在,当我初始化ContextAsyncTask我得到一个警告" 这个领域泄漏上下文对象. "

我已经看到了许多关于相同的问题,但它们都与之相关Activity/Fragment.所以我的问题是,如何Context在我的AsyncTask(顶级课程)中使用而不泄漏它

Div*_*ash 7

您可以尝试使用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)


Com*_*are 6

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

不要使用AsyncTask. 使用线程。或者,更好的是,用于ScheduledExecutorService计时组件,因为它将在后台线程上执行任务。AsyncTask唯一适当的,因为当你需要做的主应用程序线程工作时的背景部分已经完成,而这很少与服务所需。

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

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

呼叫getApplicationContext()Service和使用Context


Coc*_*chi 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();
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.