Google Drive API等待()UI线程错误

Tim*_*iko 5 android google-play-services

我正在我的Android应用程序中实现Google Drive API.我不想使用PendingResult #setResultCallback(),相反,我想使用PendingResult #await(),所以我可以在下一行得到结果而不必等待.这不是问题,因为一切都在后台运行.

但是,每次调用await()时,都会出现以下错误.我尝试对Google Drive API运行一次调用,该API在AsyncTask,Thread,IntentService,Service with AsyncTask和带有线程的服务中使用await().我每次都收到以下错误.我尝试在我的Thread实现中调用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)
Run Code Online (Sandbox Code Playgroud)

这是我用来测试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();
Run Code Online (Sandbox Code Playgroud)

ian*_*ake 6

apiClient.connect()是一个异步操作,因此为什么在AsyncTask中调用它没有帮助(在后台线程上运行连接在onConnected()UI线程上调用时没有帮助).

相反,您可以从onConnected()回调中启动AsyncTask - doInBackground()然后可以调用AsyncTask Drive.DriveApi.newContents(apiClient).await().

当然,没有必要调用await()- 使用setResultCallback()异步等待newContents()完成:

@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
     }
  });
}
Run Code Online (Sandbox Code Playgroud)