正确使用asyncTask的方法

时间:2013-08-05 20:50:49

标签: android android-asynctask

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

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

3 个答案:

答案 0 :(得分: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中执行此操作,则必须等待任务完成,并且活动将被卡住并且无法继续进行。您可以使用join()方法实现“等待任务完成”。但我重申:这是不可取的。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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