gpt4 book ai didi

android - 从 AsyncTask 中的 Activity 访问实例变量

转载 作者:行者123 更新时间:2023-11-29 14:23:38 25 4
gpt4 key购买 nike

我有一个 AsyncTask(在一个单独的文件中),它在一个 Activity 。当我实例化 AsyncTask 时,我将 Activity 作为参数。我怎样才能从访问 Activity 的实例变量AsyncTask 的 onPostExecute 方法?

谢谢!

最佳答案

将 Activity 或 Context 传递给不是 Activity 的内部(非静态)类的 AsyncTask 时必须小心 - 这是因为在此如果 Activity/ContextAsyncTask 的生命周期不同,并且如果您坚持 Activity/Context 超过你应该的时间会导致内存泄漏。

与其在 AsyncTask 中保留 Activity 或 Activity 上下文本身,不如为 Activity 保留一个 WeakReference。这将确保与 Activity 关联的内存可以在需要时由垃圾收集器 (GC) 回收。

public class MyTask extends AsyncTask<..., ..., ...> {
private WeakReference<MyActivity> mParentActivity = null;

public MyTask(MyActivity parentActivity) {
mParentActivity = new WeakReference<MyActivity>(parentActivity);
}

@Override
public ... doInBackground(... params) {
// do some stuff

// now we do something that requires the context
if (mParentActivity.get() != null) {
// the WeakReference is still valid and hasn't been reclaimed
// by the GC
final MyActivity parentActivity = mParentActivity.get();
parentActivity.doSomething();
}

// return result
}
}

传递 Context 时,请始终尽可能尝试使用 ApplicationContext,因为这是最长生命周期的上下文。

关于android - 从 AsyncTask 中的 Activity 访问实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6024658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com