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