我使用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循环检查变量是否已设置。并在我的异步类中完成该变量的更改?
这样做的正确方法是什么?
答案 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执行多项任务(例如与网络服务进行交流)的经验,这不是一个好主意。我的建议是:
为所有ws响应使用一个本地/远程(如果需要)服务和一个监听器。
“使用asyncTask的正确方法” - 编写自己的方法 - 你不会有这个问题。
答案 2 :(得分:0)
简单使用观察者模式http://en.wikipedia.org/wiki/Observer_pattern应该可以解决问题。