1

我想创建一个通用的 AsynceTask 类,我的所有活动都使用/共享它来从 url 下载内容。因此,除了将内容发送回调用 AsyncTask 类的活动中的某个方法之外,我不希望 OnPostExecute 执行任何操作。

我知道我需要创建一个构造函数来设置调用 Activity 的上下文AsyncTask,但是接下来如何使用上下文将某些内容发送回与该上下文对应的活动。我没有看到任何教程显示如何以这种方式使用上下文。

可以说我有:

public class LoginActivity {

    public int ActivityMember;

    public void HandleButtonClick(void){
        DownloadFromURL task = new DownloadFromURL(this);
        task.execute(url);
    }

    public void HandleLoginResult(int x){
        ActivityMember = x;
    }
}

现在在一个单独的java文件中我有:

    private class DownloadFromURL extends AsyncTask<List<NameValuePair>, Long, JSONObject> {
Context context;

    public void DownloadFromURL (Context context){
        this.context = context;
    }

    @Override
    protected void onPostExecute(JSONObject json) {
         context.(<- *my question involves this part of code)
    }
}

我很确定我不能调用context.ActivityMember,或者context.HandleLoginResult(y)在里面onPostExecute,因为上下文不是类型LoginActivity,它是一个上下文。那么如何LoginActivity使用它的上下文访问属于 的成员或方法呢?

4

5 回答 5

2

您可以使用((ActivityName)contextName).methodName()

但这不是一个好的解决方案。你可以试试这样的

于 2013-05-04T06:46:05.427 回答
1

将您的活动名称与上下文一起传递给异步类。

    protected void onPostExecute(SoapObject result)
    {

            if(classname.equals("LoginActivity"))
            {
                ((LoginActivity) object).method();
            }
                    else if(classname.equals("MainActivity"))
            {
                ((MainActivity) object).method();
            }


}
于 2013-05-04T06:51:50.347 回答
0

很容易做到,您只需在您的活动中创建一个方法并从您通过 AsyncTask 父类构造函数传递的实例中调用它。

假设你在你的活动中有一些这样的:

public void Foo(ArrayList<DataType> data)
{
//Do some with data
}

然后从 onPostExecute 调用此方法,如下所示:

@Override
        protected void onPostExecute(ArrayList<DataType> data)
        {
                activity.Foo(data);
        }

其中activity是通过构造函数传递的实例。干杯

于 2013-05-04T06:46:33.173 回答
0

这涉及基本的面向对象编程知识。

如果您仔细查看http://developer.android.com/reference/android/app/Activity.html,您会看到 Activity 扩展了 Context,这就是为什么您可以摆脱传递this给 AsyncTask 构造函数并让编译器执行所需的操作对象切片。

我们可以利用它为您带来优势:创建一个扩展 Activity 的抽象类(假设:DataActivity,不过只是一个示例,您可以随意命名它)并在其上编写一个名为onDataDownloadComplete(JSONObject json)(A callback) 的方法,您可以调用您的异步任务的onPostExecute. 使您的所有活动都从 DataActivity 扩展并实现该方法。将 AsyncTask 上下文从 Context 更改为 DataActivity,以便您可以调用onDataDownloadComplete回调并完成。同样,由于 DataActivity 会扩展 Activity,而 Activity 会扩展 Context,DataActivity 或任何扩展它都将是 AsyncTask 的有效上下文。

希望您觉得这个有帮助。

于 2013-05-04T06:51:56.660 回答
0

我意识到还有另一种方法可以实现我想要做的事情。这消除了异步,但是对于登录的情况,我确实希望 UI 在应用程序尝试登录时处于非活动状态。

我打电话后

asyncTask.execute() 

我可以打电话

asyncTask.get()

这将检索 doInBackground 的结果并允许您在现场运行它。或者,我可以使用超时,这样我就不会永远阻塞:

asynceTask.get(5000, TimeUnit.MILLISECONDS)
于 2013-05-04T10:09:18.750 回答