0

私は問題があります。これが私のコードです:

public String getXmlFromUrl(String url) {
    String xml = null;

        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet(url);

                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();
                }
            }
        }).run();
    // return XML
    return xml;
}

では、どうすればスレッドで url を使用でき、どうすれば xml を返すことができますか?

ご協力ありがとうございました

4

4 に答える 4

3

Android には AsyncTask が用意されており、これは目的に完全に適合します。

例:

private class XMLTask extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        // Do stuff
        // For example showing a Dialog to give some feedback to the user.
    }

    @Override
    protected String doInBackground(.. parameters..) {
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);

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

    @Override
    protected void onPostExecute(String xml) {
        // If you have created a Dialog, here is the place to dismiss it.
        // The `xml` that you returned will be passed to this method
        xml.Dowhateveryouwant

        }
    }
}
于 2012-07-25T19:33:30.050 に答える
0

2つのこと:

  • このメソッドは同期呼び出しであるため、AsyncTask を使用することをお勧めします。
  • Thread.start() を使用してスレッドを起動します。
于 2012-07-25T19:29:59.040 に答える
0

それurlを使用するために最終的にします。

xml他のスレッドが完了するまでブロックしてもかまわない場合はAtomicReference、 を呼び出した後Thread.start()(「呼び出してはならない」ことに注意してください。Thread.run()別のスレッドが生成されないことに注意してください)、同期ツール ( など) を使用してCountdownLatch、スレッドは戻る前に終了しますxml

しかし、ブロックしても構わないのであれば、別のスレッドなしでコードを実行してみませんか? ブロックできない場合は、xml値を返すことができません。設計を変更する必要があります。おそらく を実行しAsyncTaskて結果を非同期に提供する必要があります。

于 2012-07-25T19:30:34.360 に答える
0

URL を次のようにマークしてfinal、Runnable 内で次のように使用できます。

public String getXmlFromUrl(final String url) {
    // ...
}

おそらく、XML 応答を処理するために呼び出すことができるステートレス コールバック メソッドまたはクラスを定義する必要があります。次のように呼び出します。

xml = EntityUtils.toString(httpEntity);
handleXmlResponse(xml);

handleXmlResponse必要に応じて、メソッドを含むクラスのプライベート メソッドとしてメソッドを定義できますgetXmlFromUrl

XML をフェッチするたびに新しい Thread を作成するのではなく、Executorsクラスを使用して Runnable を取得して渡すことを検討してください。newSingleThreadExecutor

https://developer.android.com/reference/java/util/concurrent/Executors.html#newSingleThreadExecutor%28%29

次に例を示します。

ExecutorService mThreadPool = Executors.newSingleThreadExecutor();
public String getXmlFromUrl(String url) {
    String xml = null;

        // Note the change here. Everything else remains the same.
        mThreadPool.execute(new Runnable() {

            @Override
            public void run() {
                try {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet(url);

                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;
}
于 2012-07-25T19:35:12.150 に答える