我有一个AsyncTask(在一个单独的文件中),它被调用 活动。当我实例化AsyncTask时,我将活动发送为 PARAM。如何从中访问acitivity的实例变量 AsyncTask的onPostExecute方法?
谢谢!
答案 0 :(得分:10)
将Activity或Context
传递给不属于Activity的内部(非静态)类的AsyncTask
时必须小心 - 这是因为在这种情况下{的生命周期{1}} / Activity
与Context
不同,如果您坚持AsyncTask
/ Activity
的时间超过您的预期,则会导致内存泄漏。< / p>
您应该在活动中保留Context
,而不是在AsyncTask
中保留活动或活动上下文。这将确保在需要时垃圾收集器(GC)可以回收与Activity关联的内存。
WeakReference
传递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
,因为这是最长寿的背景。
答案 1 :(得分:1)
与程序员Bruce的答案类似,但不是通过AsyncTask本身将Activity作为Param传递,只需添加一个构造函数来获取父Activity。我自己的代码示例......
public class FileDownloader extends AsyncTask<..., ..., ...> {
private MyActivity parentActivity = null;
public FileDownloader(MyActivity parentActivity) {
this.parentActivity = parentActivity;
}
}
在您的活动中创建它时,请执行此操作...
FileDownloader fdl = new FileDownloader(this);
fdl.execute(...);
编辑:在回复您的评论时,请确保将mLogin声明为public
,然后使用...
parentActivity.mLogin
如果不起作用,请尝试...
((MyActivity)parentActivity).mLogin
答案 2 :(得分:0)
您可以从AsyncTask<Object, x x>
扩展,然后您可以传入任意数量的任意参数,无需传递对整个Activity的引用。
new CustomTask().execute(param1, param2, param3);
您可以在doInBackground中引用:
public Void doInBackground(Object... params) {
Integer id = (Integer) params[0];
String name = (String) params[1];
....
}