有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓应用程序中的java异常“无法在未调用looper prepare的线程内创建处理程序”

我正在开发我的第一个安卓应用程序,我正在尝试使用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);

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


共 (2) 个答案

  1. # 1 楼答案

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

    还有这个

     QBAuth.createSession(new QBCallback() {
    

    它在后台执行对QB的请求,并在主线程中调用回调

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

  2. # 2 楼答案

    您不能在AsyncTaskdoInBackground中显示Toast,因为它是不同的威胁,而不是主UI线程

    要显示toast或任何与UI相关的任务,必须在AsyncTaskonPostExecute方法中执行

    你能做的就是

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