使用BetterAsyncTask(Droid-Fu)补偿AsyncTask的缺点

时间:2011-12-07 17:08:30

标签: android droid-fu

经过漫长而不成功的谷歌搜索后,事实证明几乎没有关于一个名为 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文件,请告诉我,我可以发给你一份副本)

编辑:

A good example can be found here!here

好的,这是我在源代码中找到的一些其他信息:

  1. 会自动显示进度对话框。请参阅useCustomDialog(),disableDialog()
  2. 如果从doInBackground内部抛出异常,现在由handleError方法处理。
  3. 您现在应该更长时间覆盖onPreExecute(),doInBackground()和onPostExecute(),而应分别使用before(),doCheckedInBackground()和after()。
  4. 让我们看看从那时起我可以实现的目标......但仍在寻找一个有效的例子!

    编辑2:

    可以找到几个示例herehere。我坚持,但我得到一个错误。唯一的区别是我的AsyncTask没有在活动中定义,而是一个自己的类。单步执行代码会发现在创建(AsyncTask内置)对话框时发生错误。

    这是我的堆栈跟踪:

    等一下

2 个答案:

答案 0 :(得分:1)

Droid-fu现在有点过时,主要是由于缺乏Fragment支持。但是我将从我编写的使用它的应用程序中给出一个示例。

首先,您的活动类必须子类化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;
    }

最后,至少你需要对结果做些什么,比如更新类变量或填充UI等等。这是在after

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

正如您所提到的,您可以对该类执行更多操作,例如定义在任务之前在UI线程上起作用的before()覆盖,或者failed() / handleError()来处理未经检查/检查的失败。这只是一个简单的例子,希望它有所帮助。

答案 1 :(得分:0)

@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 ,即使是最好的助手类也几乎没用。花了我几个小时来弄清楚出了什么问题。再一次,&#34;谢谢你&#34;给开发者。 SOR