从另一个类调用AsyncTask

per*_*ene 7 android android-asynctask

在现有的应用程序中,我有一个内部类的活动,它扩展了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) { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我需要从另一个活动调用相同的doInBackground方法,但是onPostExecute()这个内部类的操作在一些本地UI变量上,因此不可能在clas之外使用它.有没有什么方法可以调用这个AsyncTask,只是覆盖onPostExecute和onPreExecute-method,或者我应该在另一个活动中创建另一个内部类,做同样的背景事情(当然把它移到普通的实用程序类或者什么)等等......?

Vla*_*mir 23

您可以创建一个单独的抽象包私有类,扩展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
    }
}
Run Code Online (Sandbox Code Playgroud)

并且在你的活动中只是继承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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果onPreExecute并onPostExecute包含一些常见操作,则可以应用以下模式:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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();
    ...
}    
Run Code Online (Sandbox Code Playgroud)

您也可以使用您的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();
    ...

}
Run Code Online (Sandbox Code Playgroud)

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


Sye*_*rah 12

它如此简单只需构建一个主类的对象,然后像这样调用内部类

 OuterMainClass outer = new OuterMainClass();
       outer.new InnerAsyncClass(param)
         .execute();
Run Code Online (Sandbox Code Playgroud)

这个答案为时已晚,无法帮助你,但希望能帮到别人.

谢谢