【问题标题】:How to avoid TagManager "IllegalStateException: Results have already been set"如何避免 TagManager “IllegalStateException:结果已设置”
【发布时间】:2015-02-18 21:33:35
【问题描述】:

我最近在我的 Android 应用中引入了 Google TagManager,以便将更改推送到应用配置,而无需重新部署应用。

但我得到以下实例:

java.lang.IllegalStateException: Results have already been set
at com.google.android.gms.common.internal.p.a(Unknown Source)
at com.google.android.gms.common.api.b$a.a(Unknown Source)
at com.google.android.gms.tagmanager.ed.a(Unknown Source)
at com.google.android.gms.tagmanager.ed.a(Unknown Source)
at com.google.android.gms.tagmanager.ed$b.a(Unknown Source)
at com.google.android.gms.tagmanager.ed$b.a(Unknown Source)
at com.google.android.gms.tagmanager.cj.c(Unknown Source)
at com.google.android.gms.tagmanager.ck.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

它们出现在从 Android 4.4 到 5.0.1 的各种设备上

正如您所见,堆栈跟踪中没有我的应用程序的元素,我真的很茫然,不知道我能做什么(除了删除 TagManager)来避免或减轻错误。

我发现一个与 GooglePlus 登录相关的相同错误消息的引用,因此我认为这可能与 Google Play 服务库有关。

还有人看过吗? 有什么想法吗?

已提出有关 Play-Games 项目的问题: https://code.google.com/p/play-games-platform/issues/detail?id=209

【问题讨论】:

  • 您是否尝试过下载 TagManager SDK 并反编译所有内容 + grep “结果已设置”?这将准确解释何时引发此错误,它将最终引导您找到解决方案。
  • 您使用的是哪个 Google Play 服务版本?你看过 12 月 18 日更新的最新文档吗? developers.google.com/tag-manager/android/v4
  • @JaredBurrows 6.1.71 是的,谢谢。
  • 我刚刚得到了一个非常相似的堆栈跟踪,这似乎与 tagmanager 相关我正在使用 play-services 6.5.87。我的用户在评论中写道,他大约 10 个小时没有使用该设备,而我的应用最后一次使用是在两天前。也许是关于生命周期的东西。

标签: android google-play-services google-play-games google-tag-manager


【解决方案1】:

这是由于 TagManager 中的竞争条件导致的内部错误,应在 Google Play 服务 6.7(2015 年 2 月 17 日)中修复。

https://productforums.google.com/forum/?utm_medium=email&utm_source=footer#!msg/tag-manager/NOlng117_2g/w46OkQS5Gm8J 还有https://developers.google.com/analytics/devguides/collection/android/changelog

与此同时,您可以通过以下方式解决它:

private static class MyHandler implements Thread.UncaughtExceptionHandler {

    private final Thread.UncaughtExceptionHandler defaultHandler;

    MyHandler(Thread.UncaughtExceptionHandler defaultHandler) {
        this.defaultHandler = defaultHandler;
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        String classpath = null;
        if (ex != null && ex.getStackTrace().length > 0) {
            classpath = ex.getStackTrace()[0].toString();
        }
        if (classpath != null && 
            ex.getMessage().contains("Results have already been set") && 
            classpath.contains("com.google.android.gms.tagmanager") ) {
            // ignore
         } else {
           // run your default handler
           defaultHandler.uncaughtException(thread, ex);
       }
    }
};

// Application#onCreate
public void onCreate() {
    // for catching app global unhandled exceptions
    final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler(new MyHandler(defaultHandler));
}

【讨论】:

  • 从未调用 uncaughtException。虽然,我完全按照你提到的方式添加了代码
【解决方案2】:

根据此链接,Google 已在较新版本中修复了此问题:

https://developers.google.com/analytics/devguides/collection/android/changelog

【讨论】:

  • 最好还补充一点,“修复”是升级到 Google Play Services 6.7
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多