ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

GoogleApiClient:多线程Android应用中的“结果已被消耗”

2019-07-06 12:33:20  阅读:203  来源: 互联网

标签:android multithreading google-play-services google-signin


什么是最好的处理方法

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)

从不同的线程使用两个不同的GoogleApiClients时会发生什么?

我有一个MainActivity,onStart()构建一个新的GoogleApiClient实例,然后调用

OptionalPendingResult<GoogleSignInResult> opr = 
    GoogleSignInApi.silentSignIn(googleApiClient);
opr.setResultCallback(myCallback);

同时,活动启动一个IntentService(刷新GCM令牌),它也构建一个新的GoogleApiClient实例,并调用

OptionalPendingResult<GoogleSignInResult> opr = 
    GoogleSignInApi.silentSignIn(googleApiClient);
opr.await(); // Blocks
return opr.get();

opr.get()调用发生异常.似乎GoogleApiClient在某处共享其资源,并且创建它的新实例并不能减轻我管理某些跨线程状态的麻烦.

您需要两次使用GoogleApiClient的方法是什么?

保持ApiClient的静态持有者?
保持一个共享的原子参考,如“我们正在连接,请保持”?
有一些围绕GoogleApiClient的包装?

UPDATE

MainActivity需要GoogleApiClient来确保用户已登录,如果没有则显示提示.

对于OAuth令牌,IntentService实际上只需要GoogleSignInAccount.但为了确保令牌仍然新鲜,它会使用GoogleApiClient获得一个新帐号.因此,将GoogleSignInAccount存储在某些共享存储中也会有所帮助.但我怎么知道它是否仍然新鲜呢?

解决方法:

实际上,opr.await()已经消耗了资源并将其返回.应该

OptionalPendingResult<GoogleSignInResult> opr = 
    GoogleSignInApi.silentSignIn(googleApiClient);
return opr.await(); // Blocks

标签:android,multithreading,google-play-services,google-signin
来源: https://codeday.me/bug/20190706/1397519.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有