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