Android 点击选项菜单时,进度条显示会有所延迟

Android 点击选项菜单时,进度条显示会有所延迟,android,android-progressbar,optionmenu,Android,Android Progressbar,Optionmenu,我面临在选项菜单中显示progressbar onItem的问题。 我的代码在这里: case R.id.mnuLogout: showDialog(Constants.PROGRESS_DIALOG); closeOptionsMenu(); if(MyApp.IsLoggedOut()) handler.sendEmptyMe

我面临在选项菜单中显示progressbar onItem的问题。 我的代码在这里:

case R.id.mnuLogout:

                showDialog(Constants.PROGRESS_DIALOG);
                closeOptionsMenu(); 

                             if(MyApp.IsLoggedOut())
                    handler.sendEmptyMessage(Constants.LOGOUT);
                 else
                        handler.sendEmptyMessage(Constants.ERROR_MSG);  
完成IsLogged方法后,将显示Progressbar。

您正在执行的
异步任务之后调用
get()
,并且会丢失异步行为,因为此方法会等待任务完成。您应该将try/catch块中的所有代码添加到
AsyncTask.onPostExecute()
方法中,并从该方法中关闭对话框

void doLogout() {
    new LogoutTask().execute();
}

void dispatchLogoutFinished() {
    dismissDialog(Constants.PROGRESS_DIALOG);
    if (MyApp.IsLoggedOut()) {
        // do something
    } else {
        // do something else
    }
}

private class LogoutTask extends AsyncTask<Void, Void, Void> {
    protected void onPreExecute() {
        TheActivity.this.showDialog(Constants.PROGRESS_DIALOG);
    }

    protected Void doInBackground(Void... params) {
        return null;
    }

    protected void onPostExecute(Long result) {
        TheActivity.this.dispatchLogoutFinished();
    }
}
void doLogout(){
新建LogoutTask().execute();
}
作废dispatchLogoutFinished(){
dismissDialog(Constants.PROGRESS_对话框);
if(MyApp.IsLoggedOut()){
//做点什么
}否则{
//做点别的
}
}
私有类LogoutTask扩展了AsyncTask{
受保护的void onPreExecute(){
activity.this.showDialog(Constants.PROGRESS\u对话框);
}
受保护的Void doInBackground(Void…参数){
返回null;
}
受保护的void onPostExecute(长结果){
activity.this.dispatchLogoutFinished();
}
}

我认为你不需要向处理程序发送消息。
dispatchLogoutFinished()
在UI线程上执行,因此不需要同步。

不确定发生了什么。。。但是为什么要从那里调用
AsyncTask
的方法?你不应该那样做。。。您应该从
AsyncTask
内部发送这些空消息,而不是从
onOptionsMenuItemClick
发送。没错,但异步任务是另一个类,不是此类的一部分。此外,我还使用简单方法调用(没有异步任务),然后它也会延迟:(如果我不等待响应,它将在完成任务之前处理。此外,Aysnc任务是一个单独的类,因此无法打开/关闭对话框:(如果您在UI线程中等待
AsyncTask
完成,则使用
AsyncTask
将变得不必要且毫无意义。之所以称为
AsyncTask
,是因为它是异步的,这就是它通知UI线程使用特殊方法完成的原因。如果
AsyncTask
是非静态嵌套类然后它包含对外部类的引用。否则,您可以将
活动
传递给
异步任务
的构造函数。我已删除了异步任务,但仍然存在相同的问题:(不,您没有得到它。您需要
AsyncTask
,但您还需要正确使用它。这意味着您必须执行
AsyncTask.onPostExecute()
方法中的所有内容,并且不要调用
AsyncTask.get()
方法。我也做了这件事,但您知道选项菜单似乎出现了以下问题:(