从AsyncTask获取对调用Activity的引用(不作为内部类)

时间:2010-04-27 07:29:11

标签: android android-asynctask outer-classes

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

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

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

2 个答案:

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

}