【问题标题】:onPrepareOptionsMenu acts weird if API is called from inside如果从内部调用 API,onPrepareOptionsMenu 的行为会很奇怪
【发布时间】:2014-07-21 16:58:21
【问题描述】:

我需要根据 API 调用响应启用和禁用菜单项,并且每次菜单出现时都必须调用它。

我需要异步任务,因为我必须显示进度条

    @Override
    public boolean onPrepareOptionsMenu (Menu menu) {
       handleMenuItems(menu)

     }

    private void handleMenuItems(menu)
    {


        new AsyncTask<Void, Void, Void>(){

            @Override
            protected Void doInBackground(Void... params) {
                //API call                  
                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                if (progressDialog != null)
                    progressDialog.hide();

                               //necessary menu items are enabled and disabled
                                super.onPrepareOptionsMenu(menu);
            }

            @Override
            protected void onPreExecute() {
                if (progressDialog != null){
                    progressDialog.setMessage("Checking");
                    progressDialog.show();
                }
                super.onPreExecute();
            }

        }.execute();

    }

每当我触摸选项菜单时,都会调用 onPrepareOptionsMenu 并且不会出现选项菜单,然后当我再次按下它时不会调用 onPrepareOptionsMenu 并且会出现选项菜单。

我希望每次触摸选项菜单时都会调用 api 并显示菜单。

【问题讨论】:

    标签: android-asynctask android-fragmentactivity android-optionsmenu


    【解决方案1】:

    您不应该在OnPrepareOptionsMenu 中显示和隐藏进度对话框

    注释掉进度对话框编码,其余代码正常,按预期工作

    注意:

    • 你在OnPostExecute(UI)中调用了super.OnPrepareOptionsMenu 线程)

    • 由于不需要进度条,请勿删除 AsyncTask 否则应用我的崩溃

    【讨论】:

      【解决方案2】:

      我认为这段代码并没有达到您的预期。第一次调用 onPrepareOptionsMenu 时,它只会安排 AsyncTask 在未来的时间运行,而不是立即运行。接下来它执行 super.onPrepareOptionsMenu 行,该行应该显示当时设置的选项菜单。我认为(必须检查)UI 将等待用户输入,因为它正在显示某种菜单(可能不是您所期望的)。当第二次触摸菜单时,我认为它会关闭菜单,这可能是执行 AsyncTask 的时间,这会导致您最初期望的第一个菜单。 AsyncTask 的第二个实例在第一个完成之前不会运行(除非调用 executeOnExecutor 而不是执行,但这里不是这种情况,我也不相信它有助于达到预期的结果。)

      您可能希望准备一个“虚拟”菜单(可能显示“等待...”的内容)并启动一个后台线程,在该线程中构建正确的菜单,然后在准备就绪时更新并显示新菜单(以编程方式)。

      我个人建议在 UI 线程上找到一种构建和显示菜单的方法(也许在进行更改时提前准备菜单,并在需要时显示它。

      卡梅尔

      【讨论】:

      • executeOnExecutor 没有任何区别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      相关资源
      最近更新 更多