Asynctask连接问题

时间:2014-09-17 16:00:20

标签: android android-asynctask apache-httpclient-4.x

我目前正在开发一个连接到网站以获取一些信息的应用程序(信息非常少),并且我在其中使用带有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);

我确定我做错了什么,但我不知道是什么,所以我真诚地向你求助

干杯!

3 个答案:

答案 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了解更多详情