2013-05-27 14 views
0

中出現異常「無法在線程中創建處理程序,但尚未調用looper prepare」我正在處理我的第一個android應用程序,並試圖將Quickblox.com用作我的後端。在android應用程序

爲了使用它,我需要通過使用他們的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); 

此代碼與仿真效果很好,但如果我試圖用一個真正的Android手機這是行不通的。我有連接超時錯誤。我想我需要在後臺進行這種請求(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功能也不會失敗。

回答

0

您不能在AsyncTaskdoInBackground中顯示Toast,因爲它是一個不同的威脅,而不是主UI線程。

要顯示烤麪包或任何與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(); 
+0

即使我把它放在runOnUiThread中? –

+0

我不能這樣做,因爲它不會讓我在新的QBCallback()中使用變量'res'。 –

+0

使它全球..然後它會.. – bakriOnFire

0

你並不需要使用AsyncTasks,因爲所有的操作已經在後臺執行。

而且這也是一個

QBAuth.createSession(new QBCallback() { 

它執行的後臺請求QB並在主線程中調用回調函數。

你能解釋一下你得到了什麼'連接超時錯誤'。 有什麼記錄?