Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 异步任务连接问题_Android_Android Asynctask_Apache Httpclient 4.x - Fatal编程技术网

Android 异步任务连接问题

Android 异步任务连接问题,android,android-asynctask,apache-httpclient-4.x,Android,Android Asynctask,Apache Httpclient 4.x,我目前正在开发一个应用程序,它连接到一个网站以获取一些信息(很少的信息),我正在使用一个异步任务,其中包含一个HttpClient来获取这些信息。在主(UI)线程中,我使用一个runnable加上一个处理程序来检查Asynctask是否已经完成,如果已经完成,则处理传入的信息 问题是:有时Asynctask似乎无法完成任务,使得Handler plus Runnable永远检查它,而没有任何答案。这不是网站的问题,因为我使用Xampp在本地网站上测试了它。在我看来,我做的事情并不是我应该做的 我

我目前正在开发一个应用程序,它连接到一个网站以获取一些信息(很少的信息),我正在使用一个异步任务,其中包含一个HttpClient来获取这些信息。在主(UI)线程中,我使用一个runnable加上一个处理程序来检查Asynctask是否已经完成,如果已经完成,则处理传入的信息

问题是:有时Asynctask似乎无法完成任务,使得Handler plus 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;
}
}
我肯定我做错了什么,但我不知道是什么,所以我真诚地请求你的帮助

干杯

实际上,你做得非常错误。 有一个方法
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);