Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 用BetterAsyncTask(Droid Fu)弥补AsyncTask的缺点_Android_Droid Fu - Fatal编程技术网

Android 用BetterAsyncTask(Droid Fu)弥补AsyncTask的缺点

Android 用BetterAsyncTask(Droid Fu)弥补AsyncTask的缺点,android,droid-fu,Android,Droid Fu,在谷歌上搜索了很长一段时间并没有成功,结果发现几乎没有任何关于一个叫做Droid Fu的便捷图书馆的信息 在阅读了creator()或API()的介绍之后,我不知道如何定义一个新的betterasynctask(什么方法包含什么信息等等) 因此,如果有任何人能为我(以及其他人)提供一些有用的源代码或教程,我将不胜感激 (如果您需要项目的jar文件,请告诉我,我可以给您发送一份副本) 编辑: 和 好的,下面是我在源代码中找到的一些附加信息: 将自动显示进度对话框。请参见useCustomDialo

在谷歌上搜索了很长一段时间并没有成功,结果发现几乎没有任何关于一个叫做Droid Fu的便捷图书馆的信息

在阅读了creator()或API()的介绍之后,我不知道如何定义一个新的betterasynctask(什么方法包含什么信息等等)

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

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

编辑:

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

  • 将自动显示进度对话框。请参见useCustomDialog(),disableDialog()
  • 如果从doInBackground内部引发异常,则现在由handleError方法处理
  • 现在,您应该不再重写onPreExecute()、doInBackground()和onPostExecute(),而应该分别使用before()、doCheckedInBackground()和after()
  • 让我们看看从现在起我能取得什么成果……不过仍然在寻找一个有效的例子

    编辑2:

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

    这是我的stacktrace:


    一会儿就来

    Droid fu现在有点过时了,主要是因为缺少碎片支持。但我会举一个我用它编写的应用程序的例子

    首先,活动类必须为BetterActivity(或BetterXXX活动)子类。在我的代码中,我使用了一个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
            ...
        }
    }
    
    最后,至少您需要对结果进行一些处理,比如更新类变量或填充UI或其他。这是在之后的
    中完成的:

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

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

    Droid fu现在有点过时,主要是因为缺少碎片支持。但我会举一个我用它编写的应用程序的例子

    首先,活动类必须为BetterActivity(或BetterXXX活动)子类。在我的代码中,我使用了一个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
            ...
        }
    }
    
    最后,至少您需要对结果进行一些处理,比如更新类变量或填充UI或其他。这是在
    之后的
    中完成的:

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

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

    多么痛苦的@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;
            }
        });
    
    公共静态进度对话框createProgressDialog(最终活动,
    int progressDialogTitleId,int progressDialogMsgId){
    ProgressDialog=新建ProgressDialog(活动);
    if(progressDialogTitleId)
    
    @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;
            }
        });
    
    公共静态进度对话框createProgressDialog(最终活动,
    int progressDialogTitleId,int progressDialogMsgId){
    ProgressDialog=新建ProgressDialog(活动);
    if(progressDialogTitleId)
    
    很酷,谢谢你的回复。有没有比droid fu更好、更新的替代品?我不知道。也许可以看看cwac任务()对于更薄的AsyncTask实现,我不需要.cwac-task。与cwac task相反,BetterAsyncTask确保所有任务都已完成,不管发生什么,而且它还处理progressdialog(我的代码最有可能在这里失败)我发现了错误,但由于我的声誉分数太低,我还不能发布答案。请随意给我一点提示:)酷,谢谢你的回复。有没有更好、更先进的droid fu替代品?我不知道。也许可以看看cwac任务()对于更薄的AsyncTask实现,我不需要.cwac-task。与cwac task相反,BetterAsyncTask确保所有任务都已完成,不管发生什么,而且它还处理progressdialog(我的代码最有可能在这里失败)我发现了错误,但由于我的声誉分数太低,我还不能发布答案。请随意给我一点提示:)