将上下文从服务传递到异步任务,而不会泄露它

我有一个从给定的计时器开始执行后台任务。我的需求需要短暂的网络任务,这就是为什么我坚持.ServiceAsyncTaskAsynctask

从我正在做一些操作(如启动通知)需要.现在,当我在我的中初始化时,我收到一条警告“此字段泄漏了上下文对象。AsynctaskcontextcontextAsyncTask"

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


答案 1

您可以在 AsyncTask 中传递弱引用,例如:

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

您可以尝试对要尝试访问的对象使用 一个 和 一个静态内部类。像这样:WeakReferenceAsyncTask

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
            }
        }
    }
}

推荐