是否可以从不是调用Activity类的内部类的AsyncTask中获取对启动执行AsyncTask的Activity实例的引用?
我知道this thread,但它并没有完全解决如何引用调用Activity。有人建议将对Activity的引用作为参数传递给AsyncTask构造函数,但据报道,这样做总会导致NullPointerException。
所以,我很茫然。我的AsyncTask提供了强大的功能,我不想在每个想要使用它的活动中将其复制为内部类。必须有一个优雅的解决方案。
答案 0 :(得分:10)
“优雅的解决方案”是实际尝试将其作为参数传递给构造函数或execute()
),看看它是否有效,而不是假设那个问过那个人的人问题(然后两次回答他自己的问题)知道他在做什么。我可以想到AsyncTask
内在的任何内在因素都会导致Activity
成为一个错误的构造函数参数而其他所有对象都没问题。
现在,我还没有将Activity
(或其他Context
)作为参数传递给AsyncTask
,因为我的AsyncTasks
始终是私有内部类。实际上,您想要公开AsyncTask
给我的事实是代码气味,建议这些任务应由Service
或其他控制点调解。但是,那只是我。
<强>更新强>
可以在此处找到处理此模式的更好答案:Background task, progress dialog, orientation change - is there any 100% working solution?
答案 1 :(得分:4)
我的AsyncTask
始终位于单独的包中,同时仍然绑定到特定类型的Activity
。它们在构造函数中接受它的实例并存储在局部变量中
尝试考虑创建一个封装Activity
相关内容的抽象AsyncTask
类,并通过其他活动进行扩展。
像这样:
public abstract RemoteListActivity<T> extends ListActivity{
// calls AsyncTask, shows spinning progress dialog, etc
protected abstract T someConcreteMethod();
}
public final class CustomerListActivity extends RemoteListActivity<Customer>{
protected final Customer someConcreteMethod();
}
或者,如果某些内容不适合单个层次结构,请使用接口:
interface LazyLoadable {
void setLoadingState();
void setDefaultState();
}
public class MyActivity extends Activity implements LazyLoadable{
}
public final class AsyncTask extends AsyncTask<Void, Void, Void>{
private final LazyLoadable lazyLoadable;
public MyAsyncTask(Context ctx, LazyLoadable lazyLoadable){
super(ctx);
this.lazyLoadable = lazyLoadable;
}
}