Компенсация недостатков AsyncTask с помощью BetterAsyncTask (Droid-Fu) - PullRequest
1 голос
/ 07 декабря 2011

После долгого и неудачного поиска в Google выясняется, что почти нет информации о удобной библиотеке под названием Droid-Fu https://github.com/kaeppler/droid-fu

После прочтения введениясоздатель (http://brainflush.wordpress.com/2009/11/16/introducing-droid-fu-for-android-betteractivity-betterservice-and-betterasynctask/) или API (http://kaeppler.github.com/droid-fu),) Я не мог понять, как определить новую betterasynctask (какие методы содержат какую информацию и т. д.).

Так что, если кто-то вышелТам, где я мог бы (и, в частности, другие) предоставить мне некоторый полезный исходный код или учебные пособия, я был бы очень признателен!

(Если вам нужен jar-файл проекта, дайте мне знать, я могу отправитьВы копия)

РЕДАКТИРОВАТЬ:

Хороший пример можно найти здесь! и здесь

Хорошо, вот некоторая дополнительная информация, которую я нашел в исходном коде:

  1. Автоматически отображается диалоговое окно прогресса. См. UseCustomDialog (), disableDialog ()
  2. Если исключение выдается изнутри doInBackground, этотеперь обрабатывается методом handleError.
  3. Теперь вам нужно больше переопределять onPreExecute (), doInBackground () и onPostExecute (), вместо этого вы должны использовать before (), doCheckedInBackground () и after () соответственно.

Давайте посмотрим, чего я смогу достичь с этого момента ... все еще ищем рабочий пример, хотя!

РЕДАКТИРОВАТЬ 2:

Парапримеров можно найти здесь и здесь .Я придерживаюсь этого, но я получаю ошибку.Разница лишь в том, что моя AsyncTask не определена внутри действия, а является собственным классом.Пошаговое выполнение кода показывает, что ошибка возникает при создании (встроенного AsyncTask) диалога.

Это моя трассировка стека:

через минуту

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Droid-fu сейчас немного устарел, в основном из-за отсутствия поддержки фрагментов.Но я приведу пример из приложения, которое я написал, которое использовало его.

Во-первых, ваш класс активности должен иметь подкласс BetterActivity (или BetterXXXActivity).В моем коде я использовал ListActivity, поэтому мои здесь подклассы BetterListActivity.Я также определяю подкласс BetterAsyncTask, чтобы можно было расширить некоторые функции.

public class DroidFuExample extends BetterListActivity {

    private ExampleTask mTask;
    private List<Stuff> mMainStuff;

    private class ExampleTask extends BetterAsyncTask<Void, Void, Integer> {
        private List<Stuff> mStuff;
        private DroidFuExample mContext; // a context for lifecycle management
        ...
    }
}

Теперь моей задаче не нужен параметр, используется неопределенный диалог, поэтому прогресс не публикуется, и требуется вернутьInteger.Ваши потребности могут различаться, и это влияет на типы, используемые в определении класса.

Следующий шаг - определить, что задача обрабатывает в фоновом режиме.В моем случае мне нужно заполнить mStuff.В своем классе задач определите либо doInBackground (), либо doCheckedInBackground () (doChecked ... может вызвать исключение, если вы хотите его перехватить).

    protected Integer doCheckedInBackground(Context context, Void... params)
            throws Exception {
        mStuff = // some long-running code (no longer on the UI thread)
        return 1;
    }

Наконец, по крайней мере, вам нужно сделатьчто-то с вашим результатом, например, обновить переменную класса или заполнить пользовательский интерфейс или что-то.Это делается в after:

    protected void after(Context context, Integer integer) {
        if (integer >= someAcceptablePositiveConstant) {
            mMainStuff = mStuff;
            doSomethingInTheUIWithMainStuff();
        } else {
            //gah!
        }
    }

Как вы уже упоминали, с классом можно сделать еще больше, например, определить переопределение before(), которое работает в потоке пользовательского интерфейса перед задачей, или failed() / handleError() для обработки непроверенных / проверенных сбоев.Это простой пример, надеюсь, он поможет.

0 голосов
/ 08 декабря 2011

Какая боль в @ss!Ошибка была хорошо спрятана в классе BetterActivityHelper:

public static ProgressDialog createProgressDialog(final Activity activity,
        int progressDialogTitleId, int progressDialogMsgId) {
    ProgressDialog progressDialog = new ProgressDialog(activity);
    if (progressDialogTitleId <= 0) {
        progressDialogTitleId = activity.getResources().getIdentifier(
                PROGRESS_DIALOG_TITLE_RESOURCE, "string", activity.getPackageName());
    }
    progressDialog.setTitle(progressDialogTitleId);
    if (progressDialogMsgId <= 0) {
        progressDialogMsgId = activity.getResources().getIdentifier(
                PROGRESS_DIALOG_MESSAGE_RESOURCE, "string", activity.getPackageName());
    }
    progressDialog.setMessage(activity.getString(progressDialogMsgId));
    progressDialog.setIndeterminate(true);
    progressDialog.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            activity.onKeyDown(keyCode, event);
            return false;
        }
    });

progressDialogTitleId и progressDialogMsgId ожидают значения внутри res / values ​​/ string.xml:

<!-- Droid-Fu Progressdialog -->
<string name="droidfu_progress_dialog_title">Some nasty dialog title</string>
<string name="droidfu_progress_dialog_message">Some funny message</string>

Если они не определены,будет выдано исключение времени выполнения.

К сожалению, даже самые лучшие вспомогательные классы практически бесполезны, если они UNDOCUMENTED .Мне потребовалось пару часов, чтобы понять, что пошло не так.Итак, еще раз, NO «Спасибо» разработчику.Сор

...