gpt4 book ai didi

Android 重试/取消对话框

转载 作者:太空宇宙 更新时间:2023-11-03 13:06:47 26 4
gpt4 key购买 nike

我有以下问题。我的主要 Activity 由一个 ListView 组成,其中填充了从 Web 服务获得的数据。首次加载主要 Activity 时,以防无法从网络检索数据,我想显示一个带有 2 个按钮的对话框,“重试”和“取消”。如果用户点击“回复”,将调用重新加载数据方法,如果有任何异常,对话框应该再次出现。

我还没有找到一种方法来实现我想要的行为。

@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 的新手,不习惯这种风格。

最佳答案

您应该在 ASyncTask 中运行您的 reloadItems 方法.

这些在后台线程中运行您的 Web 访问和下载过程,并允许您在 UI 线程上发布 UI 更新。

您还可以在后台线程中处理异常,然后将更新发布到显示对话框的 UI 线程。不要忘记在此失败更新后终止您的任务,否则它将继续尝试运行并认为它已成功完成。

同样重要的是,您必须在每次运行时创建任务的新实例(例如,在重试按钮的 onClick 监听器上。重复使用任务会导致异常。

关于Android 重试/取消对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3195155/

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