没有被调用:onPostExecute

时间:2012-08-24 16:08:11

标签: android android-asynctask

当我的用户点击登录按钮时,我想点击我的网络服务。我有以下代码可以这样做。

public void onClick(final View view) {
  String orgKey = inputCompany.getText().toString();
  new getAppInfo().execute("http://example.webservice.com");

这是我的getAppInfo

   private class getAppInfo extends AsyncTask<String, Void, String> {
    /** The system calls this to perform work in a worker thread and
      * delivers it the parameters given to AsyncTask.execute() */
    @Override
    protected String doInBackground(String... urls) {
        String xml = null;
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(urls[0]);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // return XML
        return xml;
    }

    /** The system calls this to perform work in the UI thread and delivers
      * the result from doInBackground() */
    @Override
    protected void onPostExecute(String result) {
        Document doc = GetDomElement(result); // getting DOM element

        NodeList nl = doc.getElementsByTagName("details");
        getChildElements(nl); 
    }

doBackground正在运行,但onPostExecute未运行。我已经将它移出了点击它已经工作但我需要它在onClick内。

如何让我在onClick中运行onPostExecute

3 个答案:

答案 0 :(得分:0)

完成onPostExecute后,

doInBackground始终被调用。尝试在 onPostExecute 记录以确认此行为。


doInBackground 方法中添加常规catch语句。

catch(Exception e){
    e.printStackTrace();
}

答案 1 :(得分:0)

首先,Java中的一般指针 - 类名称通常是大写的CamelCase,方法名称是小写的camelCase。

关于你的问题 - 您是否有机会退出活动或关闭产生任务的对话框?如果它在onclick处理程序之外工作,我猜是有些东西正在破坏AsyncTask试图执行该方法的Handler对象。

尝试在当前Activity的Handler上发布Runnable(执行AsyncTask)。

答案 2 :(得分:0)

语法正确您可能在后台进程中遇到异常,停止后台线程。在doInBackground的末尾添加一个日志语句,或者在try中添加一个catch(Throwable t)。

有信心 - 只要doInBackground成功完成,它就会被调用。

顺便说一句,你也应该在后台进行DOM解析 - 当你在UI线程中进行它时可能会导致ANR弹出窗口。