GoogleApiClient:"Result has already been consumed" 在多线程 Android 应用程序中
GoogleApiClient: "Result has already been consumed" in multi-thread Android app
最好的处理方法是什么
java.lang.IllegalStateException: Result has already been consumed.
at com.google.android.gms.common.internal.zzx.zza(Unknown Source)
at com.google.android.gms.internal.zzly.await(Unknown Source)
at com.google.android.gms.internal.zzmo.await(Unknown Source)
at com.google.android.gms.internal.zzmo.get(Unknown Source)
当使用来自不同线程的两个不同 GoogleApiClient 时会发生什么情况?
我有一个 MainActivity,onStart() 构建一个新的 GoogleApiClient 实例,然后调用
OptionalPendingResult<GoogleSignInResult> opr =
GoogleSignInApi.silentSignIn(googleApiClient);
opr.setResultCallback(myCallback);
同时,activity 启动一个 IntentService(刷新 GCM 令牌),它也构建一个新的 GoogleApiClient 实例,并调用
OptionalPendingResult<GoogleSignInResult> opr =
GoogleSignInApi.silentSignIn(googleApiClient);
opr.await(); // Blocks
return opr.get();
opr.get()
调用时发生异常。似乎 GoogleApiClient 在某处共享其资源,创建它的新实例并不能使我免于管理某些跨线程状态。
当您需要两次时,您使用 GoogleApiClient 的方法是什么?
保留 ApiClient 的静态持有者?
保持像 "we're connecting right now please hold" 这样的共享原子引用?
在 GoogleApiClient 周围有一些包装器?
更新
MainActivity 需要 GoogleApiClient 来确保用户已登录,并在未登录时显示提示。
IntentService 实际上只需要 GoogleSignInAccount,用于 OAuth 令牌。但是为了确保令牌仍然新鲜,它使用 GoogleApiClient 获取了一个新帐户。因此,也许将 GoogleSignInAccount 存储在一些共享存储中也会有所帮助。但是我怎么知道它是否还新鲜呢?
实际上,opr.await()
已经消耗了资源并且 returns 它。应该是
OptionalPendingResult<GoogleSignInResult> opr =
GoogleSignInApi.silentSignIn(googleApiClient);
return opr.await(); // Blocks
最好的处理方法是什么
java.lang.IllegalStateException: Result has already been consumed.
at com.google.android.gms.common.internal.zzx.zza(Unknown Source)
at com.google.android.gms.internal.zzly.await(Unknown Source)
at com.google.android.gms.internal.zzmo.await(Unknown Source)
at com.google.android.gms.internal.zzmo.get(Unknown Source)
当使用来自不同线程的两个不同 GoogleApiClient 时会发生什么情况?
我有一个 MainActivity,onStart() 构建一个新的 GoogleApiClient 实例,然后调用
OptionalPendingResult<GoogleSignInResult> opr =
GoogleSignInApi.silentSignIn(googleApiClient);
opr.setResultCallback(myCallback);
同时,activity 启动一个 IntentService(刷新 GCM 令牌),它也构建一个新的 GoogleApiClient 实例,并调用
OptionalPendingResult<GoogleSignInResult> opr =
GoogleSignInApi.silentSignIn(googleApiClient);
opr.await(); // Blocks
return opr.get();
opr.get()
调用时发生异常。似乎 GoogleApiClient 在某处共享其资源,创建它的新实例并不能使我免于管理某些跨线程状态。
当您需要两次时,您使用 GoogleApiClient 的方法是什么?
保留 ApiClient 的静态持有者? 保持像 "we're connecting right now please hold" 这样的共享原子引用? 在 GoogleApiClient 周围有一些包装器?
更新
MainActivity 需要 GoogleApiClient 来确保用户已登录,并在未登录时显示提示。
IntentService 实际上只需要 GoogleSignInAccount,用于 OAuth 令牌。但是为了确保令牌仍然新鲜,它使用 GoogleApiClient 获取了一个新帐户。因此,也许将 GoogleSignInAccount 存储在一些共享存储中也会有所帮助。但是我怎么知道它是否还新鲜呢?
实际上,opr.await()
已经消耗了资源并且 returns 它。应该是
OptionalPendingResult<GoogleSignInResult> opr =
GoogleSignInApi.silentSignIn(googleApiClient);
return opr.await(); // Blocks