0

我正在开发我的第一个 android 应用程序,我正在尝试使用 Quickblox.com 作为我的后端。

为了使用它,我需要通过使用他们的 SDK 创建会话来授权应用程序。

所以,我有以下代码:

// Initialize QuickBlox application with credentials.
            QBSettings.getInstance().fastConfigInit(Consts.APP_ID, Consts.AUTH_KEY, Consts.AUTH_SECRET);

            // Authorize application

            QBAuth.createSession(new QBCallback() {
                @Override public void onComplete(Result result) {}
                @Override
                public void onComplete(Result result, Object context) {
                    if (result.isSuccess()) {
                        showMainScreen();
                    } else {
                        // print errors that came from server
                        Toast.makeText(getBaseContext(), result.getErrors().get(0), Toast.LENGTH_SHORT).show();
                        progressBar.setVisibility(View.INVISIBLE);
                    }

                }
            }, QBQueries.QB_QUERY_AUTHORIZE_APP);

此代码适用于模拟器,但如果我尝试使用真正的安卓手机,它就不起作用。我有一个连接超时错误。我想我需要在后台发出这种请求(Web 服务),对吧?

所以我尝试使用 AsyncTask 在后台向 QB 发出请求,并将代码更改为:

new AsyncTask<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {

            // Initialize QuickBlox application with credentials.
            QBSettings.getInstance().fastConfigInit(Consts.APP_ID, Consts.AUTH_KEY, Consts.AUTH_SECRET);

            // Authorize application

            QBAuth.createSession(new QBCallback() {
                @Override public void onComplete(Result result) {}
                @Override
                public void onComplete(Result result, Object context) {
                    if (result.isSuccess()) {
                        showMainScreen();
                    } else {
                        // print errors that came from server
                        Toast.makeText(getBaseContext(), result.getErrors().get(0), Toast.LENGTH_SHORT).show();
                        progressBar.setVisibility(View.INVISIBLE);
                    }
                }
            }, QBQueries.QB_QUERY_AUTHORIZE_APP);
            return null;
        }
    }.execute();

我在这里看到了很多类似的问题,但我似乎找不到适用于我的代码的答案。我看到处理UI的函数需要从主线程调用,所以我想我里面的代码

onComplete(Result result, Object context)

应该在这样的块内吗?

runOnUiThread(new Runnable() 
{
    public void run() 
    {
        // code here
    }
}); 

但我也试过了,但没有用。有什么猜测吗?

我相信问题不是因为 Toast 和 showMainScreen()。这段代码仍然失败:

// Initialize QuickBlox application with credentials.
            QBSettings.getInstance().fastConfigInit(Consts.APP_ID, Consts.AUTH_KEY, Consts.AUTH_SECRET);

            QBAuth.createSession(new QBCallback() {

                @Override
                public void onComplete(Result arg0, Object arg1) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onComplete(Result arg0) {
                    // TODO Auto-generated method stub

                }
            }, QBQueries.QB_QUERY_AUTHORIZE_APP);

但是,如果我只创建 QBCallback 对象,而不将其传递给 QBAuth.createSession 函数,它不会失败。

4

2 回答 2

0

您无法显示其中ToastdoInBackground内容,AsyncTask因为它是不同的威胁,而不是主 UI 线程。

要显示 toast 或任何与 UI 相关的任务,您必须onPostExecute使用AsyncTask.

你能做的是

    new AsyncTask<Void, Void, boolean>() {

            @Override
            protected boolean doInBackground(Void... params) {

                // Initialize QuickBlox application with credentials.
                QBSettings.getInstance().fastConfigInit(Consts.APP_ID, Consts.AUTH_KEY, Consts.AUTH_SECRET);
                boolean res = false;

                // Authorize application

                QBAuth.createSession(new QBCallback() {
                    @Override public void onComplete(Result result) {}
                    @Override
                    public void onComplete(Result result, Object context) {
                        if (result.isSuccess()) {
                            //showMainScreen();
                            res = true
                        } 
                        //else {
                            // print errors that came from server
                            //Toast.makeText(getBaseContext(), result.getErrors().get(0),                   //Toast.LENGTH_SHORT).show();
                            //progressBar.setVisibility(View.INVISIBLE);
                        //}
                    }
                }, QBQueries.QB_QUERY_AUTHORIZE_APP);
                return res;
            }

          protected void onPostExecute(boolean result) {
             if(result) {
                showMainScreen();
             } else {
                Toast.makeText(getBaseContext(), result.getErrors().get(0),                   Toast.LENGTH_SHORT).show();
                            progressBar.setVisibility(View.INVISIBLE);
             }
          }
        }.execute();
于 2013-05-27T15:36:25.277 回答
0

您不需要使用 AsyncTasks,因为所有操作都已在后台执行。

还有这个

 QBAuth.createSession(new QBCallback() {

它在后台向 QB 执行请求并在主线程中调用回调。

你能解释一下你得到了什么“连接超时错误”。日志里有东西吗?

于 2013-05-29T08:45:20.603 回答