Справка Android по AsyncTask

1

Мое приложение отлично работает во всех версиях 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;
}
  • 0
    Это плохая идея - передавать ссылку на Activity, когда все, что вам действительно нужно, это строка.
Теги:
android-asynctask
android-3.0-honeycomb

1 ответ

1
Лучший ответ

Теперь, когда вы хорошо поместили свой код в отдельный статический метод, я предполагаю, что более целесообразно использовать его вместо этого. Оставив вас с возможностью вызывать его синхронно или тот же код, можно вызывать из отдельного потока. Обертка вызова в 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);
  • 0
    Я дам этому шанс и дам вам знать. Спасибо за быстрый ответ.
  • 0
    Не могу обещать, что это решит твою проблему на Соте, хотя. Но это то, что я делаю довольно часто, пишу синхронные методы и при необходимости вызываю их из отдельного потока.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню