0

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

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); 
    }

正在运行,doBackgroundonPostExecute没有。我已将它移出 on click 并且它已经工作但我需要它在 onClick 中。

我怎样才能让它onPostExecute在我的 onClick 内部运行?

4

3 回答 3

0

onPostExecute始终在完成后调用doInBackground。尝试在onPostExecute中登录以确认此行为。


在您的doInBackground方法中添加一般catch语句。

catch(Exception e){
    e.printStackTrace();
}
于 2012-08-24T16:12:32.647 回答
0

首先,一个通用的指针——Java 中的类名通常是大写的 CamelCase,方法名是小写的 camelCase。

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

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

于 2012-08-24T16:28:47.363 回答
0

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

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

顺便说一句,您也应该在后台进行 DOM 解析 - 目前您正在 UI 线程中执行此操作,这可能会导致 ANR 弹出窗口。

于 2012-08-24T16:32:29.300 回答