6

是否有可能从不是调用 Activity 类的内部类的 AsyncTask 中获取对启动 AsyncTask 执行的 Activity 实例的引用?

我知道这个线程,但是它并没有完全解决如何引用调用活动。有些人建议将 Activity 的引用作为参数传递给 AsyncTask 构造函数,但是据报道,这样做总是会导致 NullPointerException。

所以,我很茫然。我的 AsyncTask 提供了强大的功能,我不想在每个想要使用它的 Activity 中将它复制为内部类。必须有一个优雅的解决方案。

4

2 回答 2

10

“优雅的解决方案”是实际尝试将其作为参数传递(给构造函数或execute())并查看它是否有效,而不是假设提出前一个问题(然后回答他自己的问题两次)的人知道他在做什么。我想不出任何内在的东西AsyncTask会导致Activity构造函数参数不好,而其他所有对象都很好。

现在,我没有将 an Activity(或 other Context)作为参数传递给 an AsyncTask,因为 myAsyncTasks始终是私有内部类。事实上,你想要对我公开这一事实AsyncTask是一种代码味道,这表明这些任务应该由一个Service或其他一些控制点来调解。但是,这只是我。

更新

可以在此处找到处理此模式的更好答案:后台任务、进度对话框、方向更改 - 是否有任何 100% 有效的解决方案?

于 2010-04-27T11:22:37.763 回答
4

AsyncTask的 s 始终存在于单独的包中,同时仍绑定到特定类型的Activity. 他们在构造函数中接受它的实例并存储在局部变量中。尝试从创建一个封装相关内容并由其他活动扩展的抽象类
的角度进行思考。 像这样:ActivityAsyncTask

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;
    }

}
于 2010-04-27T15:53:39.277 回答