经过漫长而不成功的谷歌搜索后,事实证明几乎没有关于一个名为 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
好的,这是我在源代码中找到的一些其他信息:
让我们看看从那时起我可以实现的目标......但仍在寻找一个有效的例子!
编辑2:
可以找到几个示例here和here。我坚持,但我得到一个错误。唯一的区别是我的AsyncTask没有在活动中定义,而是一个自己的类。单步执行代码会发现在创建(AsyncTask内置)对话框时发生错误。
这是我的堆栈跟踪:
等一下
答案 0 :(得分:1)
首先,您的活动类必须子类化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