【问题标题】:Running same Asynctask multiple times sequentially按顺序多次运行同一个 Asynctask
【发布时间】:2015-05-02 16:37:49
【问题描述】:

我正在尝试按顺序执行相同的 Asynctask。例如,假设有一个 Asynctask A。现在假设 A 检查某个服务器是否繁忙。如果它很忙,它会再次检查......等等。假设它检查了 5 次,然后让用户知道该服务不可用。
所以显然可以使用相同的 Asynctask。
尝试使用循环来实现它可能会产生意想不到的结果,因为根据这个 link
Asynctask 是一种即发即弃的实例,AsyncTask 实例只能使用一次。
所以循环 5 次意味着 Asynctask 将被调用 5 次。但是如果服务器在第二次尝试时是空闲的,我不需要额外的检查。 android应用程序也可能挂起(我的)。如果我在这个话题上错了,请纠正我。

答案也是“calling task like new MyAsyncTask().execute("");
所以如果我喜欢这样——例如,

new someAsyncTask() {
            @Override
            protected void onPostExecute(String msg) {
                new someAsyncTask() {
                    @Override
                    protected void onPostExecute(String msg) {
                      ....and so on 5 times.
                   }
               }.execute(this);
            }
        }.execute(this);

应该依次调用5次,应该没有问题。
这是执行此操作的唯一方法还是存在任何其他解决方案?

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    您可以在外部类中使用字段变量:

    private int count;
    private void attemptConnect(){
        count = 0;
    
        new MyTask().execute("");
    }
    
    class MyTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            return null;
        }
    
        @Override
        protected void onPostExecute(String s) {
            count++;
            if(count < 5){
                new MyTask().execute("");
            }
        }
    }
    

    或者将计数传递给 AsyncTask 构造函数:

    private void attemptConnect(){
        new MyTask(0).execute("");
    }
    
    class MyTask extends AsyncTask<String, String, String> {
        private int count;
    
        public MyTask(int count){
            this.count = count;
        }
    
        @Override
        protected String doInBackground(String... params) {
            return null;
        }
    
        @Override
        protected void onPostExecute(String s) {
            if(count < 4){
                new MyTask(++count).execute("");
            }
        }
    }
    

    【讨论】:

    • 如果我使用匿名异步任务,这会起作用吗?我的意思是在我在问题中提供的示例中,我在其他 java 类中实现了 asynctask 类。我只是在另一个课上使用它。这会在那里工作吗?因为那样我将不得不再次写onPostExecute
    • 我发布了一个适用于独立课程的替代方案。
    • 但我使用的是匿名 Asynctask。并且在独立类中 onPostExecute 没有被覆盖。覆盖是在另一个类中完成的。如果 onPostExecute 在独立类上,您提供的示例将起作用。但它会在匿名 Asynctask 上工作吗?
    • 我的意思是这样的new someAsyncTask() { @Override protected void onPostExecute(String msg) { } }.execute(this); 对于这种类型的实现,我怎样才能按顺序调用该 Asynctask?
    • 不,不可能,因为异步任务只能执行 1 次,并且您不能创建匿名类的另一个实例。
    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多