0

我正在使用 asyncTask 来完成对服务器的 http 请求。

在这种特定情况下,我使用它来进行身份验证并登录到服务器:

代码:

public class Http extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// Make http reguest and then get response
return result;
}

protected void onPostExecute(String result) {

    System.out.println("Downloaded " + result + " bytes");
}

现在在我的主要活动中,我打电话

Http httpGet = new Http();
String result = httpGet.execute(baseUrl + "app_dev.php/client/login/" + tableNo);

但现在显然是由于异步它在实际得到响应之前从方法返回。然后我需要分析。我的活动没有必要继续运行。

我应该只运行一个while循环检查一个变量是否已设置。并在我的异步类中更改完成后的变量?

这样做的正确方法是什么?

4

3 回答 3

1

请注意,您声称您的主要活动中有:String result = httpGet.execute(baseUrl + "app_dev.php/client/login/" + tableNo);这似乎无效,因为执行不会将您的字符串返回到活动中。您可以在 postExecute() 中设置它。

当我的应用程序中有网络内容时,我通常会做什么:我在我的 actvity.xml 文件中声明了一个进度条(不确定,居中,可见性设置为“已消失”。然后,在我的 asyncTask onPreExecute() 方法中,我设置了 essential项目的可见性为 GONE,ProgressBar 的可见性为ProgressBar.VISIBLE。之后,在 postExecute 方法中,我将 ProgressBar 设置为ProgressBar.GONE,并恢复其他项目的可见性。

这样,主线程就不会阻塞。

您的问题的简单答案:在 postExecute() 方法中做任何需要 MainActivity 等待的事情。

如果您出于某种原因想要在 MainActivity 中执行此操作,那么它将不得不等待任务完成并且活动将被卡住并且无法继续进行。您可以使用 join() 方法实现这种“等待任务完成”。但我重申:这是不可取的。

于 2013-08-05T21:00:48.070 回答
0

简单使用观察者模式http://en.wikipedia.org/wiki/Observer_pattern应该可以解决问题。

于 2013-08-05T21:07:04.803 回答
0

也许有人不同意我的看法——但根据我使用 AsynchTask 执行多项任务(例如与 Web 服务的通信)的经验,这不是一个好主意。我的建议是:

  1. 使用并发包 + 您的自定义侦听器编写您自己的“异步任务”(您可以做您真正需要的事情)
  2. 对所有 ws 响应使用一个本地/远程(如果需要)服务和一个侦听器。

    “使用 asyncTask 的正确方法”——写你自己的——你不会有这个问题。

于 2013-08-05T21:04:43.383 回答