gpt4 book ai didi

android - 从另一个类调用 AsyncTask

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:18:50 24 4
gpt4 key购买 nike

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

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) { ... }
}
}

现在,我需要从另一个 Activity 调用相同的 doInBackground 方法,但是这个内部类的 onPostExecute() 对一些本地 UI 变量进行操作,因此不可能从课外。有什么方法可以调用此 AsyncTask,并覆盖 onPostExecuteonPreExecute 方法,或者我应该在其他 Activity 中创建另一个内部类,执行相同的背景事物(当然将其移至公共(public)实用程序类或其他东西),等等...?

最佳答案

可以做一个单独的抽象包私有(private)类,扩展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
}
}

在您的 Activity 中,只需继承 MyAsyncTask(顺便说一句,新类可能应该是私有(private)的),实现 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);
}
}

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

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

}

代码是我从头写的,可能有错误,但应该能说明思路。

关于android - 从另一个类调用 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16545022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com