1

在 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),我不知道如何定义一个新的更好的异步任务(什么方法保存什么信息等)。

因此,如果有人可以为我(以及其他人)提供一些有用的源代码或教程,我将不胜感激!

(如果你需要项目的jar文件,请告诉我,我可以发给你一份)

编辑:

一个很好的例子可以在这里找到!这里

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

  1. 将自动显示一个进度对话框。请参见 useCustomDialog()、disableDialog()
  2. 如果从 doInBackground 内部抛出异常,现在由 handleError 方法处理。
  3. 您现在应该不再覆盖 onPreExecute()、doInBackground() 和 onPostExecute(),而应该分别使用 before()、doCheckedInBackground() 和 after()。

让我们看看我能从这里实现什么......不过仍在寻找一个可行的例子!

编辑2:

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

这是我的堆栈跟踪:

一分钟后到

4

2 回答 2

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

现在,我的任务需要不带参数,使用不确定的对话框,因此没有发布任何进度,并且需要返回一个整数。您的需求可能会有所不同,这会影响类定义中使用的类型。

下一步是定义任务在后台处理的内容。就我而言,我需要填充 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!
        }
    }

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

于 2011-12-07T18:56:52.350 回答
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,即使是最好的助手类也几乎没有用。我花了几个小时才弄清楚出了什么问题。再说一次,不要对开发人员说“谢谢”。索尔

于 2011-12-08T15:00:52.110 回答