简体   繁体   English

GMS IllegalStateException:结果已经设置好了吗?

[英]GMS IllegalStateException : Results have already been set?

From last week , Our app occur a lot of exception about this .we use GMS 11.0.2 从上周开始,我们的应用程序出现了很多例外。我们使用GMS 11.0.2

Fatal Exception: java.lang.IllegalStateException: Results have already been set
   at com.google.android.gms.common.internal.zzbo.zza(Unknown Source)
   at com.google.android.gms.internal.zzbbl.setResult(Unknown Source)
   at com.google.android.gms.internal.zzbbf.zzz(Unknown Source)
   at com.google.android.gms.internal.zzbbf.zzf(Unknown Source)
   at com.google.android.gms.internal.zzbbf.zzb(Unknown Source)
   at com.google.android.gms.internal.zzbav.zza(Unknown Source:3)
   at com.google.android.gms.internal.zzbdk.zzb(Unknown Source)
   at com.google.android.gms.internal.zzbdk.zzrR(Unknown Source)
   at com.google.android.gms.internal.zzbdk.onConnected(Unknown Source)
   at com.google.android.gms.common.internal.zzaa.onConnected(Unknown Source)
   at com.google.android.gms.common.internal.zzn.zzsR(Unknown Source:2)
   at com.google.android.gms.common.internal.zze.zzy(Unknown Source)
   at com.google.android.gms.common.internal.zzh.handleMessage(Unknown Source:4)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:148)
   at android.os.HandlerThread.run(HandlerThread.java:61)

the log report by fabric. Fabric的日志报告。

we use firebase and gms version is 11.0.2 我们使用firebase和gms版本是11.0.2

how do we check these problems? 我们如何检查这些问题?

and the same problem in gms version 11.8.0 和gms版本11.8.0中的相同问题

java.lang.IllegalStateException: Results have already been set

   at com.google.android.gms.common.internal.zzbs.zza(Unknown Source)
   at com.google.android.gms.common.api.internal.zzs.setResult(Unknown Source)
   at com.google.android.gms.common.api.internal.zzm.zzy(Unknown Source)
   at com.google.android.gms.common.api.internal.zzm.zzf(Unknown Source)
   at com.google.android.gms.common.api.internal.zzm.zzb(Unknown Source)
   at com.google.android.gms.common.api.internal.zzc.zza(Unknown Source:3)
   at com.google.android.gms.common.api.internal.zzbr.zzb(Unknown Source)
   at com.google.android.gms.common.api.internal.zzbr.zzakz(Unknown Source)
   at com.google.android.gms.common.api.internal.zzbr.onConnected(Unknown Source)

This hack is based on Jamin's and divonas' answer. 这个黑客是基于Jamin和divonas的回答。 It works with Crashlytics and without Crashlytics. 它适用于Crashlytics,没有Crashlytics。 Call this method in Application onCreate() method. 在Application onCreate()方法中调用此方法。 If you are using Crashlytics, call this method after Crashlytics initialized. 如果您使用的是Crashlytics,请在Crashlytics初始化后调用此方法。 BTW, ui thread id may not always be 1. BTW,ui线程id可能不总是1。

/**
 * Hack for gms bug https://issuetracker.google.com/issues/70416429
 * https://stackoverflow.com/questions/47726111/gms-illegalstateexception-results-have-already-been-set
 */
private void handleGMS70416429() {
    final Thread.UncaughtExceptionHandler defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    final long uiThreadId = Thread.currentThread().getId();
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            if (e != null && t.getId() != uiThreadId && e.getStackTrace() != null && e.getStackTrace().length > 0
                    && e.getStackTrace()[0].toString().contains("com.google.android.gms")
                    && e.getMessage() != null && e.getMessage().contains("Results have already been set")) {
                return; // non-UI thread
            }
            if (defaultExceptionHandler != null)
                defaultExceptionHandler.uncaughtException(t, e);
        }

    });
}

Since the bug hasn't been fixed yet, call handleGMSException() in BaseApplication's onCreate() method or implement your own ExceptionHandler. 由于该bug尚未修复,请在BaseApplication的onCreate()方法中调用handleGMSException()或实现自己的ExceptionHandler。 This hack is based on Jamin's answer, updated on Hexise's comment. 这个黑客是基于Jamin的回答,更新了Hexise的评论。

private void handleGMSException() {
    Thread.UncaughtExceptionHandler rootHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
        if (!isGMSException(thread, throwable)) {
            rootHandler.uncaughtException(thread, throwable);
        }
    });
}

private boolean isGMSException(Thread thread, Throwable throwable) {
    //Check if Main Thread.
    if (throwable == null || thread.getId() == 1) return false;

    if (throwable.getStackTrace() != null && throwable.getStackTrace().length > 0
            && throwable.getStackTrace()[0].toString().contains("com.google.android.gms")
            && throwable.getMessage().contains("Results have already been set")) {
        return true;
    }

    return false;
}

I haven't solved this bug, but I try to catch it by UncaughtExceptionHandler .I'm using fabric, so I register MyUncaughtExceptionHandler after fabric so that I can determine whether handle this problem first. 我还没有解决这个bug,但是我试图通过UncaughtExceptionHandler捕获它。我正在使用fabric,所以我在fabric之后注册了MyUncaughtExceptionHandler,这样我就可以确定是否先处理这个问题。 if I find is this exception. 如果我发现是这个例外。 I will catch it. 我会抓住它的。

//try to catch some uncaught exception
 public static boolean crashInterceptor(Thread thread, Throwable throwable) {

if (throwable == null || thread.getId() == 1) {
  //Don't intercept the Exception of Main Thread.
  return false;
}

String classpath = null;
if (throwable.getStackTrace() != null && throwable.getStackTrace().length > 0) {
  classpath = throwable.getStackTrace()[0].toString();
}

//intercept GMS Exception
if (classpath != null
    && throwable.getMessage().contains("Results have already been set")
    && classpath.contains("com.google.android.gms")) {
  //CrashHelper.logNonFatalException();
  return true;
}

return false;
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何避免TagManager“IllegalStateException:结果已经设置” - How to avoid TagManager “IllegalStateException: Results have already been set” java.lang.illegalstateexception:已经在此layoutinflater上设置了一个工厂 - java.lang.illegalstateexception: a factory has already been set on this layoutinflater Android View Pager IllegalStateException:已在此LayoutInflater上设置工厂 - Android View Pager IllegalStateException: A factory has already been set on this LayoutInflater Maps API需要已设置的其他权限 - Maps API requires additional permissions that have already been set java.lang.IllegalStateException:已经调用了getResources() - java.lang.IllegalStateException: getResources() has already been called java.lang.IllegalStateException:结果已被使用 - java.lang.IllegalStateException: Result has already been consumed LiveWallpaper:java.lang.IllegalStateException:Surface已经发布 - LiveWallpaper: java.lang.IllegalStateException: Surface has already been released java.lang.IllegalStateException: getResources() 或 getAssets() 已被调用 - java.lang.IllegalStateException: getResources() or getAssets() has already been called Android上的OpenGLES - IllegalStateException:已为此实例调用setRenderer - OpenGLES on Android - IllegalStateException: setRenderer has already been called for this instance IllegalStateException:视图已添加到窗口管理器中 - IllegalStateException: view has already been added to the window manager
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM