Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android重试/取消对话框_Android - Fatal编程技术网

Android重试/取消对话框

Android重试/取消对话框,android,Android,我有以下问题。我的主要活动由一个列表视图组成,其中填充了从web服务获得的数据。首次加载主活动时,如果无法从web检索数据,我希望显示一个带有两个按钮的对话框,“重试”和“取消”。如果用户单击“回复”,将调用重新加载数据方法,如果出现任何异常,该对话框将再次出现 我还没有找到一种方法来实现我想要的行为 @Override protected void onResume() { super.onResume(); Log.i("ItemListActivity", "onResume(

我有以下问题。我的主要活动由一个列表视图组成,其中填充了从web服务获得的数据。首次加载主活动时,如果无法从web检索数据,我希望显示一个带有两个按钮的对话框,“重试”和“取消”。如果用户单击“回复”,将调用重新加载数据方法,如果出现任何异常,该对话框将再次出现

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

@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侦听器上)。重用任务将导致异常