如果从内部调用API,onPrepareOptionsMenu会很奇怪

时间:2014-07-21 16:58:22

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

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

我需要asynctask因为我必须显示进度条

    @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并显示菜单。

2 个答案:

答案 0 :(得分:4)

您不应该在OnPrepareOptionsMenu

中显示和隐藏进度对话框

注释进度对话框编码和其余代码是否正常并按预期工作

注意:

  • 您已在super.OnPrepareOptionsMenu中调用OnPostExecute(用户界面 螺纹)

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

答案 1 :(得分:3)

我认为这段代码不会按预期执行。当第一次调用onPrepareOptionsMenu时,它只调度AsyncTask以便在将来运行而不是立即运行。接下来它执行super.onPrepareOptionsMenu行,该行应该显示当时设置的选项菜单。我认为(必须检查)UI将等待用户输入,因为它显示某种菜单(可能不是你所期望的)。当第二次触摸菜单时,我认为它会关闭菜单,这可能是执行AsyncTask的时间,这会产生您首先想到的第一个菜单。 AsyncTask的第二个实例在第一个实例完成之前不会运行(除非调用executeOnExecutor而不是execute,但这不是这里的情况,我认为它不能帮助预期的结果。)

你可能想要一个&#34;虚拟&#34;菜单准备好了(可能会显示&#34;等待......&#34;)然后启动一个后台线程,它会构建正确的菜单,然后当它准备就绪时更新并显示一个新菜单(以编程方式)。

我个人会建议找到一种方法来构建和显示UI线程上的菜单(可能会提前准备菜单,提前做出更改,并在需要时显示它。

卡梅尔