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

那么,如何在我的 Thread 中使用 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进入 a AtomicReference,并在调用后Thread.start()(注意您应该“不”调用Thread.run()- 这不会产生另一个线程),使用一些同步工具(例如 a 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方法的类的私有方法。

您可能要考虑的一件事是使用Executors该类来获取 anewSingleThreadExecutor并将您的 Runnable 传递给该类,而不是每次您想要获取一些 XML 时都创建一个新线程:

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 回答