【问题标题】:Correct way to use asyncTask正确使用 asyncTask 的方法
【发布时间】:2013-08-06 05:38:15
【问题描述】:

我正在使用 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循环检查一个变量是否已设置。并在我的异步类中更改完成后的变量?

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

【问题讨论】:

  • 您预计需要等待多长时间才能收到回复?
  • 它将通过本地 wifi 运行。不是互联网,所以如果它最多超过 5 秒,那么事情就很不对劲。如果一切正常,应该很快。
  • 您期望result 是什么,您需要用它做什么?需要解析的 JSON 或 XML?
  • 现在它是一个尝试,但我希望它是 JSON。结果将包含一个 nonce 键和一些数据。
  • 在您的问题得到满意答案后,通过单击绿色勾号将该答案选为有效答案是公平的。

标签: android android-asynctask


【解决方案1】:

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

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

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

您的问题的简单答案:在 postExecute() 方法中执行任何需要 MainActivity 等待的操作。

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

【讨论】:

  • 你说,如果你真的需要它在 asyncTask 中。我还能怎么做?当您使用 http get 请求时,它可以在活动线程中执行。
  • 以一个线程为例,这是一个更简单的版本无论如何,我答案的最后 7 行应该给你你想要的。
  • 哦,好的,我明白了。但是使用线程会不会还有等待响应的同样问题?
  • 取决于你如何实现它。如果您希望您的活动等待线程/异步任务完成,只需调用 join() 方法,但这会破坏多线程的整个目的并会干扰您的活动。如果您需要对检索到的数据执行某些操作,而不干扰活动,请在 postExecute() 方法中执行。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 2021-02-15
      相关资源
      最近更新 更多