【问题标题】:Android Help with AsyncTaskAsyncTask 的 Android 帮助
【发布时间】:2011-05-15 00:06:13
【问题描述】:

我的应用程序在所有版本的 Android 中都能正常工作,但它失败了,因为我在主线程上进行网络调用。我下面的代码在url.openStream() 上失败了,我想我需要在单独的线程上进行此调用。另外,我创建了这个类Utilities,因此我可以引用我在应用程序的许多部分中使用的函数。我确信我做错了,但这是我当时所知道的。我希望有人愿意花时间向我展示我应该如何做到这一点,以及如何将openStream 调用封装在AsyncTask 中。在此先感谢您的帮助。另外,最近几天我一直在尝试自己解决问题。

class Utilities {
    static XMLReader xr;
    static URL url;
    private final static int CHUNK_SIZE = 32 * 1024;
    static byte[] _fileIOBuffer = new byte[CHUNK_SIZE];

static String DBGetOnlineVersionNumber(final Activity activity){

    final String version = null;

    try {

        /* Create a URL we want to load some xml-data from. */
        String location = activity.getString(R.string.version_file_location);
        url = new URL(location);

        /* Get a SAXParser from the SAXPArserFactory. */
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();

        /* Get the XMLReader of the SAXParser we created. */
        xr = sp.getXMLReader();
        /* Create a new ContentHandler and apply it to the XML-Reader*/
        final XMLVersionReader myExampleHandler = new XMLVersionReader();
        xr.setContentHandler(myExampleHandler);

        xr.parse(new InputSource(url.openStream())); //Fails here
        /* Parsing has finished. */
    } catch (Exception e) {
        System.out.println("XML Pasing Excpetion = " + e);
    }
    return version;
}

【问题讨论】:

  • 当你真正想要的只是一个字符串时,传递 Activity 引用是个坏主意。

标签: android android-asynctask android-3.0-honeycomb


【解决方案1】:

既然您已经很好地将代码放在一个单独的静态方法中,我猜用它来代替它更合适。让您可以同步调用它,或者可以从单独的线程调用相同的代码。如果将调用添加到您的 Activity 中,则可以将调用封装到 AsyncTask 中。

new AsyncTask<Activity, Void, String>() {
    @Override
    public String doInBackground(Activity... activities) {
        return Utilities.DBGetOnlineVersionNumber(activities[0]);
    }
    @Override
    public void onPostExecute(String result) {
        Log.d("VERSION_NUMBER", result);
    }
}.execute(this);

【讨论】:

  • 我会试一试,让您知道。感谢您的快速回复。
  • 虽然不能保证这能解决您在 Honeycomb 上的问题。但这是我经常做的事情,编写同步方法,如果需要,从单独的线程调用它们。
  • 效果很好。非常感谢您的帮助和快速响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
相关资源
最近更新 更多