【发布时间】:2014-05-15 21:17:56
【问题描述】:
我有一个 Activity 'A' 及其子片段、Activity 'B' 和 GetTask 类。 用户启动应用程序并进入 Activity A。当用户查看 ListView 时,AsyncTask 正在为 Activity B 加载数据。但这可能需要一段时间,用户可以在没有 ListView 数据的情况下移动到 Activity B。所以他必须等待。我在这里创建了一个 ProgressDialog 并想以某种方式检查 AsyncTask 何时完成。
现在我将静态变量 instance 与静态方法 getInstance() 一起使用,该方法在 PostExecute 方法中设置为“1”,然后在我的活动 B 中使用它
int instance = GetTask.getInstance();
然后我创建了一个 ProgressDialog,但我无法让 AsyncTask 状态知道何时关闭我的对话框。 task.getStatus() 始终显示RUNNING 状态。
我尝试使用 OnComplete 监听器来实现,示例代码如下 公共类 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 接口:
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);
活动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; 而已。感谢您的帮助。
【问题讨论】:
标签: android android-asynctask broadcastreceiver listener