web-dev-qa-db-fra.com

GMS IllegalStateException: les résultats ont déjà été définis?

Depuis la semaine dernière, notre application présente de nombreuses exceptions à ce sujet. Nous utilisons 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)

le rapport de journal par tissu.

nous utilisons firebase et la version gms est 11.0.2

comment pouvons-nous vérifier ces problèmes?

et le même problème dans gms version 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)
22
Jamin

Ce hack est basé sur la réponse de Jamin et des divonas. Cela fonctionne avec Crashlytics et sans Crashlytics. Appelez cette méthode dans la méthode Application onCreate (). Si vous utilisez Crashlytics, appelez cette méthode après l'initialisation de Crashlytics. BTW, identifiant de thread ui ne peut pas toujours être 1.

private Thread.UncaughtExceptionHandler mDefaultExceptionHandler;
private long mUIThreadId;

/**
 * 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() {
    mDefaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    mUIThreadId = Thread.currentThread().getId();
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            if (e != null && t.getId() != mUIThreadId && 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 (mDefaultExceptionHandler != null)
                mDefaultExceptionHandler.uncaughtException(t, e);
        }

    });
}
4
Hexise

Puisque le bogue n'a pas encore été corrigé, appelez handleGMSException () dans la méthode onCreate () de BaseApplication ou implémentez votre propre ExceptionHandler. Ce hack est basé sur la réponse de Jamin, mise à jour sur le commentaire de 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;
}
3
divonas

Je n'ai pas résolu ce bogue, mais j'essaie de l'attraper par UncaughtExceptionHandler. J'utilise un tissu, donc j'enregistre MyUncaughtExceptionHandler après tissu afin de pouvoir déterminer s'il faut d'abord traiter ce problème. si je trouve est cette exception. Je vais l'attraper.

//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;
}
}
0
Jamin