我目前正在开发一个连接到网站以获取一些信息的应用程序(信息非常少),并且我在其中使用带有HttpClient的Asynctask来获取此信息。在主(UI)线程中,我使用runnable和Handler来检查Asynctask是否已经完成,如果是,则处理传入的信息。
问题是:有时Asynctask似乎没有完成任务,使Handler加Runnable永远检查它而没有任何答案。这不是网站的问题,因为我在使用Xampp的本地网站上进行了测试。在我看来,我没有按照它的意图做某事。
我"解决"通过我的Android应用管理器强制关闭应用程序的问题(应用程序然后需要不到1次迭代才能获取信息),但我不想对那些要去的人说使用它:"嘿,如果出现问题,请通过您的应用管理器强制关闭应用程序",我希望该应用程序可以毫无问题地运行,因此我向您寻求帮助。 :)
这里有一些代码:
public class Postman extends AsyncTask<String,String,String> {
@Override
protected String doInBackground(String... s) {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://website.com/" + s[0]);
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
for(int i = 1; i < s.length; i++){
pairs.add(new BasicNameValuePair(Integer.toString(i),s[i]));
}
try {
post.setEntity(new UrlEncodedFormEntity(pairs));
HttpResponse r = client.execute(post);
String res = EntityUtils.toString(r.getEntity());
return res;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
这个课我用来与网站沟通。我创建一个Postman对象然后我使用postman.execute(&#34; phpPageToCommunicate.php&#34;,+ params);然后我使用以下代码检查它是否已经完成:
final Handler h = new Handler();
Runnable r = new Runnable(){
@Override
public void run() {
if(postman.getStatus() == AsyncTask.Status.FINISHED()){
// some code
}else{
h.postDelayed(this,1000);
}
}
};
h.postDelayed(r,1500);
我确定我做错了什么,但我不知道是什么,所以我真诚地向你求助
干杯!
答案 0 :(得分:1)
实际上你正在做非常错误。
您可以在onPostExecute
课程中覆盖一种方法AsyncTask
,并在其中执行您需要的操作。该方法中的所有内容都在UI线程上完成,因此您无需关心它。
第三个类参数实际上是您在onResult
中期望的结果类型。因此,在您的情况下,您正在通过<String, String, String>
,因此onPostExecute
将为onPostExecute(String result)
。
答案 1 :(得分:0)
你在这里不需要处理程序。
您应该使用asyncTask中的onPostExecute而不是Handler。 执行任务后,至少AsyncTask将立即通知此方法。
http://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result)
答案 2 :(得分:0)
好的,你正在做异步任务错误
private class GetInfo extends
AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... strUrl) {
// Do something with strUrl
// Store the result in res variable(String)
return res; //Returns this to onPostExecute
}
@Override
protected void onPostExecute(String result) {
// Set Data to View or save it
}
}
并在主线程中调用
new GetInfo().execute(//string to process);
doInBackground方法处理数据(从api或你的情况下的某些东西获取数据).. 所有繁重的工作都在这里完成需要时间。
结果存储在String中,该字符串返回到onPostExecute,可以将其设置为视图或保存在db等中。
希望有所帮助......
编辑:还有一个名为onPreExecution()的方法,如果你想在doInBackground方法被调用之前允许它们进行初始化。
我还要指出<String, Void, String>
,这里第一个字符串是Async任务将从主线程中的execute方法获得的数据类型,第二个Void将用于执行某些操作,而在backgorud中是正在工作..比如进度条更新等。第3个字符串将是doInBackground将返回到postexecute方法的数据类型。
请阅读文档@ developers.android了解更多详情