单击选项菜单时进度条显示有一些延迟

发布于 2024-11-15 07:17:00 字数 423 浏览 3 评论 0原文

我面临在选项菜单中选择的项目上显示进度条的问题。 我的代码在这里:

case R.id.mnuLogout:

                showDialog(Constants.PROGRESS_DIALOG);
                closeOptionsMenu(); 

                             if(MyApp.IsLoggedOut())
                    handler.sendEmptyMessage(Constants.LOGOUT);
                 else
                        handler.sendEmptyMessage(Constants.ERROR_MSG);  

IsLogged 方法完成后显示进度条。

I am facing the issue with displaying progressbar onItem selected in option menu.
My code is here:

case R.id.mnuLogout:

                showDialog(Constants.PROGRESS_DIALOG);
                closeOptionsMenu(); 

                             if(MyApp.IsLoggedOut())
                    handler.sendEmptyMessage(Constants.LOGOUT);
                 else
                        handler.sendEmptyMessage(Constants.ERROR_MSG);  

Progressbar is displayed after completion of IsLogged method.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

执着的年纪 2024-11-22 07:17:00

您在执行 AsyncTask 之后立即调用 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();
    }
}

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

You're calling get() right after the AsyncTask as executed and lose asynchronous behavior because this method waits until task is finished. You should add all the code in try/catch block to AsyncTask.onPostExecute() method and also dismiss the dialog from this method.

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();
    }
}

And I don't think you need to send messages to the handler. The dispatchLogoutFinished() is executed on the UI thread, so there's no need for synchronization.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文