Вызовите 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) { ... } } } 

Теперь мне нужно вызвать тот же метод doInBackground из другого действия, но onPostExecute() этого внутреннего класса работает с некоторыми локальными переменными пользовательского интерфейса, и поэтому его невозможно использовать из-за пределов класа. Есть ли способ, которым я могу назвать эту AsyncTask, и просто переопределить метод onPostExecute и onPreExecute , или я должен создать еще один внутренний класс в другом onPreExecute , сделать то же самое (например, переместить его в общий класс-класс или Что-то) и т. Д.?

Вы можете сделать отдельный абстрактный пакет частного класса, расширяя AsyncTask и doInBackground() метод 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 ( 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 } } } 

Если 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); } } 

И использовать его в своей деятельности следующим образом:

 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(); ... } 

Я написал код из головы, поэтому он может содержать ошибки, но он должен проиллюстрировать идею.

Это так просто Просто просто создайте объект основного класса и вызовите внутренний класс, как это

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

Этот ответ слишком поздно, чтобы помочь вам, но надеюсь, что это поможет другим.

благодаря

Если мы создадим один статический метод, который находится в одном классе и будет выполняться в любом классе в doInBackground AsyncTask, мы сможем легко обновить интерфейс через тот же класс и даже в другом классе.