【问题标题】:Call AsyncTask from another class从另一个类调用 AsyncTask
【发布时间】:2013-05-14 13:49:20
【问题描述】:

在现有应用程序中,我有一个扩展 AsyncTask 的内部类的活动,如下所示:

public class Activity_1 extends BaseActivity {
    ....
    new async().execute();
    ...

    public class asyncextends AsyncTask<Void, Void, String> {
        protected String doInBackground(Void... progress) { ... }
        protected void onPreExecute() { ... }
        protected void onPostExecute(String result) { ... }
    }
}

现在,我需要从另一个活动中调用相同的 doInBackground 方法,但是这个内部类的 onPostExecute() 对一些本地 UI 变量进行操作,因此无法从类外部使用它。 有什么方法可以调用这个 AsyncTask,然后重写 onPostExecuteonPreExecute-方法,或者我应该在另一个活动中创建另一个内部类,做同样的背景事情(当然把它移到 common实用程序类或其他东西)等...?

【问题讨论】:

标签: android android-asynctask


【解决方案1】:

你可以做一个单独的抽象包私有类,扩展AsyncTask并实现doInBackground()方法:

abstract class MyAsyncTask extends AsyncTask<Void, Void, String> {
    @Override
    final protected String doInBackground(Void... progress) { 
        // do stuff, common to both activities in here
    }
}

在您的活动中,只需从 MyAsyncTask 继承(顺便说一下,新类可能应该是私有的),实现 onPostExecute()onPreExecute() 方法:

public class Activity_1 extends BaseActivity {

    ...
    new Async1().execute();
    ...

    private class Async1 extends MyAsyncTask {
        @Override
        protected void onPreExecute(){ 
            // Activity 1 GUI stuff
        }

        @Override
        protected void onPostExecute(String result) {
            // Activity 1 GUI stuff
        }
    }
}

如果onPreExecuteonPostExecute 也包含一些常见的操作,您可以应用以下模式:

abstract class MyAsyncTask extends AsyncTask<Void, Void, String> {
    public interface MyAsyncTaskListener {
       void onPreExecuteConcluded();
       void onPostExecuteConcluded(String result);  
    }

    private MyAsyncTaskListener mListener;

    final public void setListener(MyAsyncTaskListener listener) {
       mListener = listener;
    }

    @Override
    final protected String doInBackground(Void... progress) { 
        // do stuff, common to both activities in here
    }

    @Override
    final protected void onPreExecute() {
        // common stuff
        ...
        if (mListener != null) 
            mListener.onPreExecuteConcluded();
    }

    @Override
    final protected void onPostExecute(String result) {
        // common stuff
        ...
        if (mListener != null) 
            mListener.onPostExecuteConcluded(result);
    }
}

并在您的活动中使用它,如下所示:

public class Activity_1 extends BaseActivity {

    ...
    MyAsyncTask aTask = new MyAsyncTask();
    aTask.setListener(new MyAsyncTask.MyAsyncTaskListener() {
       @Override
       void onPreExecuteConcluded() {
           // gui stuff
       }

       @Override
       void onPostExecuteConcluded(String result) {
           // gui stuff
       }
    });
    aTask.execute();
    ...
}    

您也可以让您的Activity 实现MyAsyncTaskListener

public class Activity_1 extends BaseActivity implements MyAsyncTask.MyAsyncTaskListener {
    @Override
    void onPreExecuteConcluded() {
        // gui stuff
    }

    @Override
    void onPostExecuteConcluded(String result) {
       // gui stuff
    }

    ...
    MyAsyncTask aTask = new MyAsyncTask();
    aTask.setListener(this);
    aTask.execute();
    ...

}

我从头开始编写代码,所以它可能包含错误,但它应该说明这个想法。

【讨论】:

  • 正是我正在寻找的这样的东西。明天早上第一件事会尝试实施它。
  • 工作就像一个魅力。谢谢!
  • 很好的答案!但我无法弄清楚为什么我会得到以下MyAsyncTask aTask = new MyAsyncTask(); 无法实例化类型 MySyncTask 任何帮助将不胜感激!
  • @Smittey 一定是复制粘贴错误 - MyAsyncTask 的第二个实现不应该是抽象的
  • 很棒的例子,尤其是监听器的实现。在我当前的项目中完美运行! :)
【解决方案2】:

就是这么简单,只需构建一个主类的对象,然后像这样调用内部类

 OuterMainClass outer = new OuterMainClass();
       outer.new InnerAsyncClass(param)
         .execute();

这个答案为时已晚,无法帮助您,但希望对其他人有所帮助。

谢谢

【讨论】:

  • 很高兴它帮助了某人:)
  • 嘿,你能帮我一个忙吗..它工作得很好,但现在我必须将值返回给调用者类,我应该怎么做..?我从另一个类中调用了 Asynctask 类。所以我想在那个调用者类中得到 asyncTask 的结果。你知道怎么做吗?谢谢:)
  • 从 Asynctask 的 onPostExecute() 方法调用调用者类的方法
  • 是的,你是对的。这会起作用,但如果我想为不止一个类实现它。?
  • 制作一个静态对象,然后从不同的类和 onPostExc.. 方法中传递不同的值,在 onPostEx.. 方法中检查该变量的值,从那里你可以知道哪个类调用了它from "if" 语句调用适当的方法。
【解决方案3】:

1.在ClassOne中创建AsynckTask的构造函数。

2.Crate 对象或 ClassOne 通过 new 关键字。

3.按对象调用异步任务

ClassOne{

class AsyncParmas extends AsyncTask {

        public ADDloadGeofenceDetails() {
        }

        @Override
        protected void onPreExecute() {


            super.onPreExecute();
        }

        @Override
        protected Object doInBackground(Object... params) {

}
}

Class ClassTwo{
ClassOne obj= new ClassOne ();

                    obj.new AsyncParmas ().execute();
}
}

GoodLuck 谁遇到了问题。

【讨论】:

    【解决方案4】:

    如果我们在一个类中创建一个静态方法,并将在 AsyncTask 的 doInBackground 中的任何类中执行,我们可以轻松地通过同一个类甚至不同类更新 UI。

    【讨论】:

    • 用具体例子给出答案,仅供参考是没有帮助的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多