【问题标题】:Android Retry/Cancel DialogAndroid 重试/取消对话框
【发布时间】:2010-07-07 22:14:52
【问题描述】:

我有以下问题。我的主要活动包括一个 ListView,其中填充了从 Web 服务获得的数据。首次加载主要活动时,如果无法从网络检索数据,我想显示一个带有 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 新手,不习惯这种风格。

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

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

    同样重要的是,您必须在每次运行任务时为其创建一个新实例(例如,重试按钮的 onClick 侦听器。重用任务将导致异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2012-04-07
      • 2011-07-27
      • 1970-01-01
      相关资源
      最近更新 更多