Android 异步任务连接问题
我目前正在开发一个应用程序,它连接到一个网站以获取一些信息(很少的信息),我正在使用一个异步任务,其中包含一个HttpClient来获取这些信息。在主(UI)线程中,我使用一个runnable加上一个处理程序来检查Asynctask是否已经完成,如果已经完成,则处理传入的信息 问题是:有时Asynctask似乎无法完成任务,使得Handler plus Runnable永远检查它,而没有任何答案。这不是网站的问题,因为我使用Xampp在本地网站上测试了它。在我看来,我做的事情并不是我应该做的 我通过Android的应用程序管理器强制关闭应用程序来“解决”问题(然后应用程序只需不到1次迭代即可获得信息),但我不想对将要使用它的人说:“嘿,如果出现问题,请通过你的应用程序管理器强制关闭应用程序”,我希望应用程序能够顺利运行,所以我请求你的帮助。:) 下面是一些代码:Android 异步任务连接问题,android,android-asynctask,apache-httpclient-4.x,Android,Android Asynctask,Apache Httpclient 4.x,我目前正在开发一个应用程序,它连接到一个网站以获取一些信息(很少的信息),我正在使用一个异步任务,其中包含一个HttpClient来获取这些信息。在主(UI)线程中,我使用一个runnable加上一个处理程序来检查Asynctask是否已经完成,如果已经完成,则处理传入的信息 问题是:有时Asynctask似乎无法完成任务,使得Handler plus Runnable永远检查它,而没有任何答案。这不是网站的问题,因为我使用Xampp在本地网站上测试了它。在我看来,我做的事情并不是我应该做的 我
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;
}
}
我肯定我做错了什么,但我不知道是什么,所以我真诚地请求你的帮助
干杯 实际上,你做得非常错误。
有一个方法onPostExecute
,您可以在AsyncTask
类中重写它,并在其中执行您需要的操作。该方法中的所有操作都是在UI线程上完成的,所以您不必关心它
第三个类参数实际上是您在
onResult
中期望的结果类型。因此,在您的示例中,您正在传递
,因此您的onPostExecute
将是onPostExecute(字符串结果)
这里不需要处理器
您应该从asyncTask中使用onPostExecute,而不是处理程序。
至少AsyncTask会在任务执行后立即通知此方法
好的,您的异步任务做得不对
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
}
}
doInBackground方法处理数据(从api或您的案例中的某些东西获取数据)。。
所有需要时间的繁重工作都在这里完成
结果存储在一个字符串中,该字符串被重新发送到onPostExecute,在那里可以设置为视图或保存在数据库中等
希望能有帮助
编辑:还有另一个名为onPreExecution()的方法,如果您想在调用doInBackground方法之前初始化变量和内容,它允许您进行初始化
我还想指出,
,这里的第一个字符串是异步任务将从主线程中的execute方法获得的数据类型,第二个Void将用于在backgorud中的do工作时执行一些操作。。如进度条更新等。。第三个字符串是doInBackground将返回到postexecute方法的数据类型
请阅读文档@developers.android了解更多详细信息您可以在asynctask的PostExcute中保留一个标志,表示如果您的任务未完成,您可以向用户显示警报对话框。与其让另一个线程检查asynctask是否完成,为什么不使用OnPostExecute方法处理结果并执行回调?这就是AsyncTask的使用方式。如果它是
活动的内部类
,那么只需按照建议使用onPostExecute()
。如果它是一个单独的类,则返回结果到您的活动
。您不应该为此需要处理程序
。在调试模式下运行时,请确保执行并完成doInBackground。(也可以使用onPostExecute
,但这里可能存在一些更深层次的问题)。可能是另一个asynctask为自己保留asynctask执行器。njzk2,您的意思是大量asynctask可能会产生此错误?我的意思是,如果一个人没有完成,那么其他人就不能跑了?非常感谢!我的应用程序现在真的更快了,问题也少了很多。我会继续学习以取得更好的成绩。
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);