在活动中使用嵌套的AsycTask时,将在onDestroy之后保留处理程序引用

时间:2016-03-13 15:17:29

标签: android android-memory

我有一些示例代码,它非常简单地执行一些繁重的工作,并向处理程序发送消息以更新UIThread。我关心的是我传递给构造函数的处理程序引用。如果我的活动在asncTask仍在运行时被销毁,那么处理程序引用不会为空?

this

2 个答案:

答案 0 :(得分:1)

是的,处理程序的引用将保留在内存中,直到它具有引用计数> 0

我认为你应该使用AsyncTask().onProgressUpdate来更新用户界面的进度,这会做你正在尝试做的事情。

修改

如果你在onPostExecute中更新ui,那么你不需要使用onProgressUpdate(我的道歉)。

只需使用接口作为回调函数,如下所示:

private interface Callback {
    void updateUI(String value);
}

private static class SomeLongRunningTask extends AsyncTask<Void, String, Boolean> {
    private Callback mCallback;

    public SomeLongRunningTask(Callback callback)  {
        mCallback = callback;
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        mCallback.updateUI("success");
    }
}

// somewhere else...
Callback callback = new Callback() {
    @Override
    public void updateUI(String value) {
        Button btn = (Button) me.findViewById(R.id.someButton);
        btn.setText((String) msg.obj);
    }
};

new SomeLongRunningTask(callback).execute();

将处理程序实例作为静态变量似乎也不正确。它将持续到卸载课程。

答案 1 :(得分:0)

通常,每当我编写AsyncTask子类时,我都会使用这样的模式:

    private WeakReference<Callback> mCallbackRef;

    public MyAsyncTask(Callback callback)  {
        mCallbackRef = new WeakReference<>(callback);
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        if (mCallbackRef != null) {
            Callback callback = mCallbackRef.get();
            if (callback != null) {
                callback.updateUI("success");
            }
        }
    }