5

AsyncTaskであるhttpClientクラスを実装しようとしています(そうしないと、メインスレッドに接続があるために例外が発生します)。私はこのようなことを試みました:

private class execHttpAsync extends AsyncTask <String, String, HttpResponse>
    {
        public String resultString;

        @Override
        protected HttpResponse doInBackground(String... params) 
        {
            String url = params[0];

            HttpClient httpClient = new DefaultHttpClient();
            HttpGet request = new HttpGet(url);           
            request.setHeader("Content-Type", "text/xml");
            HttpResponse response;
            try {
                response = httpClient.execute(request);
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return response;
        }

        @Override
       protected void onPostExecute(HttpResponse result) 
        {
            StringBuffer returned = new StringBuffer();

            InputStream content = result.getEntity().getContent();
            BufferedReader rd = new BufferedReader(new InputStreamReader(content, "UTF-8"));                
            String line;
            while ((line = rd.readLine()) != null) 
            {
                String endOfLine = "";
                returned.append(line + endOfLine);
            }
            content.close(); 

         String retVal = returned.toString();

         try 
         {
             String header = retVal.substring(0, 1);
             if (!header.equals("<"))
              {
                retVal = retVal.replace(header, "");
              }
         } 
         catch (Exception e) 
         {
            // TODO: handle exception
         }

         resultString = returned.toString();

        }

    }

しかし、私は最終的に応答を得る必要があります。このクラスをインスタンス化してから、メンバーとして応答を取得しようとしましたが、うまくいきませんでした。助言がありますか ?

4

2 に答える 2

12

この方法を試してください

private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
      String response = "";
      for (String url : urls) {
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        try {
          HttpResponse execute = client.execute(httpGet);
          InputStream content = execute.getEntity().getContent();

          BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
          String s = "";
          while ((s = buffer.readLine()) != null) {
            response += s;
          }

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

    @Override
    protected void onPostExecute(String result) {
      textView.setText(result);
    }
  }
于 2012-10-27T14:51:35.193 に答える
1

これは非同期操作であるため、次のようになります。

myRetValue = new myAsyncTask.execute();

からの戻り値onPostExecute()をmyRetValueに割り当てません。あなたの

resultString = returned.toString();

returned.toString()生成されたものはすべて変数に割り当てられるはずresultStringです(これはAsyncTaskクラスの外部で宣言されているため、基本的にコードは一見問題なく見えます。単に何も含まれていない可能性がありreturnedます。AsyncTaskコードにブレークポイントを設定して、それがないかどうかを調べてください。あなたが思うように本当に振る舞います。

于 2012-10-27T14:52:20.573 に答える