gpt4 book ai didi

android - 如何在启动 Activity 时检查(收听)异步任务状态

转载 作者:行者123 更新时间:2023-11-30 02:53:43 24 4
gpt4 key购买 nike

我有一个 Activity “A”及其子 fragment 、 Activity “B”和 GetTask 类。用户启动应用程序并进入 Activity A。当用户查看 ListView 时,AsyncTask 正在为 Activity B 加载数据。但这可能需要一段时间,用户可以在没有 ListView 数据的情况下移动到 Activity B。所以他必须等待。我在这里创建一个 ProgressDialog 并想以某种方式检查 AsyncTask 何时完成。

现在我将静态变量 instance 与静态方法 getInstance() 一起使用,该方法在 PostExecute 方法中设置为“1”,然后将其放入 Activity B

int instance = GetTask.getInstance();

然后我创建一个 ProgressDialog,但我无法获取 AsyncTask 状态以了解何时关闭我的对话框。 task.getStatus() 始终显示 RUNNING 状态。

我尝试使用 OnComplete 监听器实现它,示例代码如下公共(public)类 GetForeignToursTask 扩展 AsyncTask 实现 OnTaskCompleteListener {

ActivityA 只是启动一个 AsyncTask:

GetTask task = new GetTask(this, null);
task.execute(url);

GetTask 类示例:

    private Context context;
OnTaskCompleteListener listener;

private static int instance = 0;

public GetTask(Context context, OnTaskCompleteListener listener) {
this.listener = listener;
this.context = context;
}

@Override
public void onTaskCompleted(int status) {
Log.d("log", status); // I don't get here at all
}

ActivityB代码:

GetTask task = new GetTask();
task.getStatus(); // here is always RUNNING
int instance = GetTask.getInstance();

if (instance != 1) {
final ProgressDialog dialog = new ProgressDialog(ToursListActivity.this);
dialog.setMessage("Loading...");
dialog.show();
// I also need to pause here until AsyncTask is done.
}

listener.onTaskCompleted(1); // error here

OnTaskCompleteListener 接口(interface):

public interface OnTaskCompleteListener {
void onTaskCompleted(int status);
}

我不确定我是否正确地使用了所有的 CompleteListener。据我了解,要使 CompleteListener 工作,它应该从我将要收听的 Activity 开始,但我的 AsyncTask 已经在运行并且我不从 ActivityB 执行它。如何让它变得更好?或者为什么我不进入 onTaskCompleteListener 方法?

我将 ActivityA 中的 GetTask 执行代码更改为 listener.onTaskCompleted(1); 并在 ActivityB 中的 listener.onTaskCompleted(1); 行得到相同的错误。

NullPointerException

更新

ActivityB ListView 依赖于用户将点击的 ListItem。所以我认为我无法在 AsyncTask 完成之前加载 ListView。

解决方案

好吧,我在我的 AsyncTask 中使用 BroadcastReceiver 和静态方法来确定 AsyncTask 是否在 ActivityB 启动之前完成。

这是我的代码。在 GetTask 类中,我添加了方法:

static boolean taskStatus = false;
public static boolean GetTaskStatus() {
return taskStatus;
}

在 onPostExecute() 中

Intent intent = new Intent("ru.myapp.asynctaskcompleted");
context.sendBroadcast(intent);

Activity B

private ProgressDialog dialog;

protected void onCreate(Bundle savedInstanceState) {
...
dialog = new ProgressDialog(ActivityB.this);
taskStatus = GetTask.GetTaskStatus();
...
if (!taskStatus) { // check if AsyncTask already completed
dialog.setMessage("Loading...");
dialog.show();
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
} else {
items = datasource.getSelectedItems(cid);
setUpView(context, items);
taskStatus = false; // in case of reloading data this should be returned to false I think
}

private BroadcastReceiver asynctaskcompleted = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "AsyncTask completed");
datasource = new ItemsListDataSource(context);
datasource.open();
items = datasource.getSelectedItems(cid);
setUpView(context, items);
dialog.dismiss();
}
};

public void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction("ru.myapp.asynctaskcompleted");
filter.addCategory("android.intent.category.DEFAULT");
registerReceiver(asynctaskcompleted, filter);
}

public void onPause() {
super.onPause();
unregisterReceiver(asynctaskcompleted);
}

这是 link to another question我用了;就是这样。感谢您的帮助。

最佳答案

不需要调用getStatus(),不需要新建接口(interface)OnTaskCompleteListener,也不需要getInstance ()

这是您应该如何做的。

mProgressDialog.show();
new GetTask()
{
@Override
protected void onPostExecute(Void result)
{
mProgressDialog.dismiss();

//this means the task is done.
}
}.execute(this, null);

关于android - 如何在启动 Activity 时检查(收听)异步任务状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23688830/

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