2013-12-16 42 views
3

這GoogleAuthUtil爲gettoken()調用:GoogleAuthUtil.getToken()拋出:RuntimeException的:不能()內螺紋已不叫Looper.prepare創建處理程序

String token = GoogleAuthUtil.getToken(appContext, accountName, scope); 

偶爾失敗與此異常:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare(): 
ak: GooglePlayServicesNotAvailable 
    at com.google.android.gms.auth.GoogleAuthUtil.a(Unknown Source) 
    at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 
    at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) 

所以(杜)明顯的東西是谷歌的代碼試圖創建一個處理程序:)但是,我們正在從一個標準的調用爲gettoken()(非活套)線程與所有每Google's documentation推薦的異常處理和明確的文件說「示例說明如何在阻塞的非主線程上下文中使用GoogleAuthUtil「。所以例如它當然不應該在UI線程上調用。

gplay文檔中有一點是不明確的:我們將應用程序上下文傳遞給getToken(),但文檔沒有說明是否需要特定的上下文,例如從一個活動。其他人有經驗嗎?我不明白這可能會導致問題,但你永遠不知道。

主要問題:如何恢復?目前,我們發現異常並放棄,但這意味着我們無法獲得受影響用戶的身份驗證。

像往常一樣從Google員工的指導,將不勝感激:)

謝謝!

回答

4

我想我們已經想通了。 RuntimeException在處理GooglePlayServicesAvailabilityException時來自getErrorDialog();有關異常處理的內容是從堆棧跟蹤中排除的。這就是爲什麼失敗非常罕見 - 只有不尋常的設備配置纔會拋出異常。

WRONG:像谷歌的文檔,例如我們的處理程序這樣做:

} catch (GooglePlayServicesAvailabilityException e) { 
    int errorCode = e.getConnectionStatusCode(); 
    if (GooglePlayServicesUtil.isUserRecoverableError(errorCode)) { 
     Dialog errorDialog = GooglePlayServicesUtil.getErrorDialog(errorCode, resolutionActivity, ...); 

但是,這並不工作,因爲你不能在一個非彎針線調用getErrorDialog()。

FIX

Activity resolutionActivity = ...; 

try { 
    String token = GoogleAuthUtil.getToken(appContext, accountName, scope); 
    ... 
} catch (GooglePlayServicesAvailabilityException e) { 
    final int errorCode = e.getConnectionStatusCode(); 
    if (GooglePlayServicesUtil.isUserRecoverableError(errorCode)) { 
     resolutionActivity.runOnUiThread(new Runnable() { 
      @Override public void run() { 
       Dialog errorDialog = GooglePlayServicesUtil.getErrorDialog(errorCode, resolutionActivity, ...); 
       errorDialog.show(); 

我會更新我們已經發布了這一點,並證實它是原因後,但它似乎有可能。

如果這是問題,那麼Google的文檔應該更新,因爲它顯示在後臺線程上調用getErrorDialog()。


我們運以上和解決問題的解決辦法:GooglePlayServicesUtil.getErrorDialog()應該在UI線程調用。

相關問題