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)
这个答案为时已晚,无法帮助你,但希望能帮到别人.
谢谢
| 归档时间: |
|
| 查看次数: |
25320 次 |
| 最近记录: |