2014-10-10 6 views
5

내 Android 용 애플리케이션에 Google 드라이브 API를 구현하고 있습니다. PendingResult # setResultCallback()을 사용하고 싶지 않고, PendingResult # await()를 사용하여 다음 라인에서 결과를 얻을 수 있으므로 기다릴 필요가 없습니다. 모든 것이 백그라운드에서 실행되기 때문에 이것은 문제가되지 않습니다.Google 드라이브 API 대기() UI 스레드 오류

그러나 await()을 호출 할 때마다 다음 오류가 발생합니다. AsyncTask, Thread, IntentService, AsyncTask가있는 서비스 및 스레드가있는 서비스에서 await()를 사용하는 Google 드라이브 API에 대한 단일 호출을 실행 해 보았습니다. 매번 다음 오류가 발생했습니다. 내 스레드 구현에서 Looper.prepare()를 호출 해 보았지만 아무 것도 해결하지 못했습니다.

누구도이 문제를 겪었습니까?

java.lang.IllegalStateException: await must not be called on the UI thread 
     at com.google.android.gms.internal.hm.a(Unknown Source) 
     at com.google.android.gms.common.api.a$a.await(Unknown Source) 
     at [OMITTED].GoogleDriveManager$2.onConnected(GoogleDriveManager.java:83) 
     at com.google.android.gms.internal.hc.c(Unknown Source) 
     at com.google.android.gms.common.api.c.eK(Unknown Source) 
     at com.google.android.gms.common.api.c.d(Unknown Source) 
     at com.google.android.gms.common.api.c$2.onConnected(Unknown Source) 
     at com.google.android.gms.internal.hc.c(Unknown Source) 
     at com.google.android.gms.internal.hc.cp(Unknown Source) 
     at com.google.android.gms.internal.hb$h.b(Unknown Source) 
     at com.google.android.gms.internal.hb$h.d(Unknown Source) 
     at com.google.android.gms.internal.hb$b.fv(Unknown Source) 
     at com.google.android.gms.internal.hb$a.handleMessage(Unknown Source) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5146) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 
     at dalvik.system.NativeStart.main(Native Method) 

내가 API를 테스트하기 위해 사용하고있는 코드입니다 :

 apiClient = new GoogleApiClient.Builder(mContext) 
      .addApi(Drive.API) 
      .addScope(Drive.SCOPE_APPFOLDER) 
      .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
       @Override 
       public void onConnected(Bundle bundle) { 
        LogUtil.log(TAG, "onConnected()"); 
        connected = true; 

        DriveApi.ContentsResult result = Drive.DriveApi.newContents(apiClient).await(); 

       } 
       @Override 
       public void onConnectionSuspended(int i) { 
        LogUtil.log(TAG, "onConnectionSuspended()"); 
        connected = false; 
       } 
      }) 
      .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
       @Override 
       public void onConnectionFailed(ConnectionResult result) { 
        LogUtil.log(TAG, "onConnectionFailed()"); 
        connected = false; 
       } 
      }) 
      .build(); 
    apiClient.connect(); 
+0

입니다 : 비동기 완료 newContents() 기다릴 setResultCallback()를 사용하여 - 물론

은, 지금까지 await()를 호출 할 필요가 없다? – tyczj

+0

asynctask의 doInBackground 메서드 내에서 두 번째 코드 블록을 실행하고 두 번째 코드 블록에 오류가 표시되었습니다. –

+0

분명히하지 않았기 때문에 구현 한 방법을 보여줄 수 있습니까? – tyczj

답변

6

apiClient.connect()는 AsyncTask를 내에서 호출하는 것은 도움이되지 않는 이유 따라서, 비동기 작업입니다 (아무튼 백그라운드 스레드에서 연결 실행 UI 스레드에서 onConnected()을 호출 할 때 도움이되지 않습니다.)

대신 onConnected() 콜백에서 AsyncTask를 시작할 수 있습니다. AsyncTask의 doInBackground()Drive.DriveApi.newContents(apiClient).await()을 호출 할 수 있습니다. 당신의 AsyncTask를 어디

@Override 
public void onConnected(Bundle bundle) { 
    LogUtil.log(TAG, "onConnected()"); 
    connected = true; 

    Drive.DriveApi.newContents(apiClient).setResultCallback(
     new ResultCallback<DriveApi.ContentsResult>() { 
    @Override 
    public void onResult(DriveApi.ContentsResult result) { 
     // Use result 
    } 
    }); 
} 
+0

이제는 의미가 있습니다. 대신 .blockingConnect()를 사용하고 있으며 모든 것이 작동합니다. 감사! –

+1

이 대답이 도움이된다면 동의하십시오. – ianhanniballake

+0

익명의 내부 클래스에서 결과를 가져 와서 호출 함수로 되돌려 보내려면 어떻게해야합니까? 그것은 막혔다. – Hephaestus