Java 获取android帐户的身份验证令牌时显示对话框

Java 获取android帐户的身份验证令牌时显示对话框,java,android,google-api,Java,Android,Google Api,当我的应用程序从帐户管理器中检索google帐户的身份验证令牌时,我决定显示带有消息“Authorization”的对话框,然后我想更新对话框设置消息“Save contacts”,并在此时执行保存联系人的长时间操作,但当我尝试在下面的代码中这样做时,我的身份验证对话框不会显示(需要8秒的黑屏,然后对话框出现一秒钟并关闭)。我正在处理程序线程中创建和更新对话框,该线程绑定到UI线程(在onCreate方法中创建处理程序)。在创建对话框时,看起来UI线程被阻塞。谢谢。 这是我的代码: public

当我的应用程序从帐户管理器中检索google帐户的身份验证令牌时,我决定显示带有消息“Authorization”的对话框,然后我想更新对话框设置消息“Save contacts”,并在此时执行保存联系人的长时间操作,但当我尝试在下面的代码中这样做时,我的身份验证对话框不会显示(需要8秒的黑屏,然后对话框出现一秒钟并关闭)。我正在处理程序线程中创建和更新对话框,该线程绑定到UI线程(在onCreate方法中创建处理程序)。在创建对话框时,看起来UI线程被阻塞。谢谢。 这是我的代码:

public void gotAccount(final GoogleAccountManager googleAccountManager,
        final Account account)
{

    SharedPreferences settings = getSharedPreferences(PREF, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("accountName", account.name);
    editor.commit();
    Log.i("gotAccount","start new thread");

    new Thread(new Runnable()
    {

        public void run()
        {
            Log.i("gotAccount-Thread run()","start show loading message");
            createLoadingMessage();
            Log.i("gotAccount-Thread run()","complete show loading message");
            Log.i("gotAccount-Thread run()","start getAuthToken");
            googleAccountManager.manager
            .getAuthToken(account, AUTH_TOKEN_TYPE, true, new AccountManagerCallback<Bundle>()
            {

                @Override
                public void run(AccountManagerFuture<Bundle> future)
                {
                    try
                    {
                        Log.i("gotAccount-run()","get auth token complete");
                        Log.i("callback-run()","start get result");
                        Bundle bundle = future.getResult();

                        if (bundle.containsKey(AccountManager.KEY_INTENT))
                        {
                            Intent intent = bundle
                                    .getParcelable(AccountManager.KEY_INTENT);
                            int flags = intent.getFlags();
                            flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK;
                            intent.setFlags(flags);
                            startActivityForResult(intent, REQUEST_AUTHENTICATE);

                        } else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN))
                        {
                            createSaveContactsMessage();

                            setAuthToken(bundle
                                    .getString(AccountManager.KEY_AUTHTOKEN));

                            longOperation();
                            completeSave(getText(R.string.saved) + ": "
                                    + currentCount);

                        }
                    } catch (Exception e)
                    {
                        handleException(e);
                    }
                }

            },null);
        }
    }).start();
}
公共帐户(最终GoogleAccountManager GoogleAccountManager,
决算(帐目)
{
SharedReferences设置=GetSharedReferences(首选项,0);
SharedReferences.Editor=settings.edit();
编辑器.putString(“accountName”,account.name);
commit();
Log.i(“gotAccount”、“启动新线程”);
新线程(newrunnable())
{
公开募捐
{
i(“gotAccount线程运行(),“开始显示加载消息”);
createLoadingMessage();
i(“gotcount Thread run(),“complete show loading message”);
i(“gotAccount线程运行(),“启动getAuthToken”);
googleAccountManager.manager
.getAuthToken(帐户,身份验证令牌类型,true,新AccountManagerCallback()
{
@凌驾
公共作废运行(AccountManagerFuture)
{
尝试
{
Log.i(“gotAccount-run(),“get auth token complete”);
i(“callback-run(),“start-get-result”);
Bundle=future.getResult();
if(bundle.containsKey(AccountManager.KEY_INTENT))
{
意图=捆绑
.getParcelable(AccountManager.KEY\u意向);
int flags=intent.getFlags();
标志&=~Intent.FLAG\u活动\u新任务;
意图。设置标志(标志);
startActivityForResult(意图、请求和验证);
}else if(bundle.containsKey(AccountManager.KEY\u AUTHTOKEN))
{
createSaveContactsMessage();
setAuthToken(包)
.getString(AccountManager.KEY_AUTHTOKEN));
长手术();
completeSave(getText(R.string.saved)+“:”
+电流计数);
}
}捕获(例外e)
{
手部异常(e);
}
}
},空);
}
}).start();
}

有一种简单的方法来处理线程。例如,AsyncTask,您可以在preExecute()中定义进度条,在Background()中执行需要执行的操作,并在onPostExecute()中删除对话框

更多关于