Android重试/取消对话框
我有以下问题。我的主要活动由一个列表视图组成,其中填充了从web服务获得的数据。首次加载主活动时,如果无法从web检索数据,我希望显示一个带有两个按钮的对话框,“重试”和“取消”。如果用户单击“回复”,将调用重新加载数据方法,如果出现任何异常,该对话框将再次出现 我还没有找到一种方法来实现我想要的行为Android重试/取消对话框,android,Android,我有以下问题。我的主要活动由一个列表视图组成,其中填充了从web服务获得的数据。首次加载主活动时,如果无法从web检索数据,我希望显示一个带有两个按钮的对话框,“重试”和“取消”。如果用户单击“回复”,将调用重新加载数据方法,如果出现任何异常,该对话框将再次出现 我还没有找到一种方法来实现我想要的行为 @Override protected void onResume() { super.onResume(); Log.i("ItemListActivity", "onResume(
@Override
protected void onResume() {
super.onResume();
Log.i("ItemListActivity", "onResume()");
if(isNewInstance) {
reloadItems();
isNewInstance = false;
}
}
private void reloadItems() {
try {
itemService.reloadItems();
items = itemService.getItemList();
listAdapter.notifyDataSetChanged();
} catch (Exception e) {
showDialog(RETRY_DIALOG);
}
}
protected Dialog onCreateDialog(int id) {
switch(id) {
case RETRY_DIALOG:
return new AlertDialog.Builder(this).setTitle(R.string.retryDialog_title)
.setPositiveButton(R.string.retryDialog_retry, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
reloadItems();
}
})
.setNegativeButton(R.string.retryDialog_quit, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.create();
}
return null;
}
第一次从onResume()调用reloadItems()时,如果遇到异常,将显示该对话框。但是,当我单击“重试”按钮时,这次从对话框的onclicklistener调用了reloadItems(),对话框不会再次显示,我想这是因为onclicklistener只有在reloadItems()第二次返回后才会返回
我试图从onClick()在新线程中运行reloadItems(),但代码仍然在主线程中运行。如果在新线程中从onResume()运行reloadItems(),代码将在新线程中运行
调试时我还注意到,showDialog(RETRY_dialog)返回后,对话框不会立即显示,只有在reloadItems()返回后才会显示
因为我想做的是非常常见的行为,所以我确信有一个“最佳实践”解决方案。我对Android完全陌生,我不习惯这种风格。你应该在一个新的环境中运行你的重载项方法 它们在后台线程中运行web访问和下载过程,并允许您在UI线程上发布UI更新 您还可以在后台线程中处理异常,然后向显示对话框的UI线程发布更新。不要忘记在更新失败后终止任务,否则它将继续尝试运行并认为它已成功完成 同样重要的是,您必须在每次运行任务时创建一个新实例(例如,在重试按钮的onClick侦听器上)。重用任务将导致异常