7

在现有应用程序中,我有一个带有扩展 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,并且只是覆盖onPostExecuteand onPreExecute-方法,或者我应该在另一个活动中创建另一个内部类,做同样的背景事情(当然将它移动到公共实用程序类或其他东西) , ETC...?

4

4 回答 4

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
    }
}

并且在您的活动中只是继承自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();
    ...

}

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

于 2013-05-14T13:58:37.550 回答
15

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

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

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

谢谢

于 2015-03-20T12:16:33.187 回答
0

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 谁面临问题。

于 2017-11-24T12:10:49.450 回答
-1

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

于 2014-01-22T08:03:24.570 回答