我需要根据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并显示菜单。
答案 0 :(得分:4)
您不应该在OnPrepareOptionsMenu
注释进度对话框编码和其余代码是否正常并按预期工作
注意:强>
您已在super.OnPrepareOptionsMenu
中调用OnPostExecute
(用户界面
螺纹)
由于不需要进度条,请不要删除AsyncTask 否则应用我的崩溃
答案 1 :(得分:3)
我认为这段代码不会按预期执行。当第一次调用onPrepareOptionsMenu时,它只调度AsyncTask以便在将来运行而不是立即运行。接下来它执行super.onPrepareOptionsMenu行,该行应该显示当时设置的选项菜单。我认为(必须检查)UI将等待用户输入,因为它显示某种菜单(可能不是你所期望的)。当第二次触摸菜单时,我认为它会关闭菜单,这可能是执行AsyncTask的时间,这会产生您首先想到的第一个菜单。 AsyncTask的第二个实例在第一个实例完成之前不会运行(除非调用executeOnExecutor而不是execute,但这不是这里的情况,我认为它不能帮助预期的结果。)
你可能想要一个&#34;虚拟&#34;菜单准备好了(可能会显示&#34;等待......&#34;)然后启动一个后台线程,它会构建正确的菜单,然后当它准备就绪时更新并显示一个新菜单(以编程方式)。
我个人会建议找到一种方法来构建和显示UI线程上的菜单(可能会提前准备菜单,提前做出更改,并在需要时显示它。
卡梅尔