【问题标题】:Use one instance of AsyncTask throughout Activity在整个 Activity 中使用一个 AsyncTask 实例
【发布时间】:2013-11-11 22:55:00
【问题描述】:

我有许多AsyncTask 设置为单独的类。我在整个应用程序中重复使用它们。我想知道,在可能需要不止一个 AsyncTask 的地方,是否可以多次使用该自定义 AsyncTask 类的一个实例?这确实是一个装饰性问题,因为它让我有多余的代码部分,特别是当AsyncTask 使用回调与其开始活动进行通信时。

我试过这样做 -

MyTask task = new MyTask(new someCallBackListener){

    @Override
    public void taskDone(boolean youDone){

    }
});

然后在我的活动中调用

task.execute(params);

这似乎是第一次工作,但我不能多次执行它。每次我想使用它时,我真的只需要初始化一个新任务吗?

【问题讨论】:

    标签: android-asynctask


    【解决方案1】:

    根据android文档here(线程规则部分),异步任务只能执行一次

    该任务只能执行一次(如果 尝试第二次执行。)

    因此不可能重用 AsyncTask 实例。进一步的this SO 链接将对您有所帮助!

    【讨论】:

    • 这很烦人。任何已知的解决方法,或者我应该接受它。
    • @Rarw 我不能说没有任何解决办法。但我想不出任何办法,因为 android 文档是这么说的......
    【解决方案2】:

    虽然您不能使用两次相同的实例,但我认为您可以通过这种方式创建实例来重用回调实现

    new MyTask(this).execute(params);
    

    并像这样在 Activity 或 Fragment 中实现回调

    public class SomeActivity extends Activity implements MyTask.someCallBackListener {
    
        //All the Activity code
    
        public void taskDone(boolean youDone) {
    
        }
    }
    

    这样,您可以创建 AsyncTask 的多个实例,而不会出现那些困扰您的冗余代码部分。

    【讨论】:

    • 不错的主意。我会调查一下。
    • 我已经这样做了,它可以工作......但现在我在同一个活动中有一个按钮,我试图创建另一个实例......但即使我重用了同一个......这个仍然会发生...在您的示例 taskDone 中,如果您希望在第一次使用时发生特定指令但在第二次使用不同的指令怎么办?所以例如:第一次我需要它来保存请求的值......第二次我需要它来保存文件。我有相同的设置,使用我在活动中使用的方法的接口,但它仍然是相同的方法,我需要一个不同的回调。有没有办法做到这一点?
    • 您可以在回调中包含一个计数器或布尔值,并使用它来了解您必须通​​过开关或 if/else 结构执行什么任务
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多