15

Od zeszłego tygodnia, Nasza aplikacja występuje dużo o tym .My wyjątkiem użycia GMS 11.0.2GMS IllegalStateException: Wyniki zostały już ustawione?

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) 

raport dziennika tkaniną.

używamy Firebase i gms wersja 11.0.2

jaki sposób sprawdzić te problemy?

i ten sam problem w wersji 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) 
+0

Spróbuj dodać tę linię w kodzie: 'kompilacji„com.google.android.gms: Play-usługi: 11.0.4'' jak jakie były pouczono w dokumentacji, jak [Dodaj usługi Google Play do projektu] (https://developers.google.com/android/guides/setup#add_google_play_services_to_your_project). Możesz także sprawdzić [ten post] (https://productforums.google.com/forum/#!msg/tag-manager/NOlng117_2g/w46OkQS5Gm8J), aby uzyskać dodatkowe informacje. –

+0

Rozwiązałeś problem? – Debugger

+0

Czy masz jakieś aktualizacje w tym numerze ?, Doświadczyłem tego samego problemu w mojej aplikacji (usługi Play 11.6.2). – Pat

Odpowiedz

0

nie mam rozwiązać ten problem, ale staram się go złapać przez UncaughtExceptionHandler .I'm za pomocą tkaniny, więc zarejestrować MyUncaughtExceptionHandler po tkaninie aby ustalić, czy najpierw poradzę sobie z tym problemem. jeśli znajdę ten wyjątek. Złapię to.

//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

Czy rozwiązałeś problem? – Debugger

2

Ponieważ błąd nie została jeszcze ustalona, ​​zadzwoń handleGMSException() w BaseApplication za onCreate metodę() lub zaimplementować własną ExceptionHandler. Ten hack opiera się na odpowiedzi Jamina.

private void handleGMSException() { 
    Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { 
     if (!isGMSException(thread, throwable)) { 
      Thread.getDefaultUncaughtExceptionHandler().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; 
} 
+0

Czy wejdzie w nieskończoną pętlę? Ponieważ DefaultUncaughtExceptionHandler został już zmieniony na dostosowany, Thread.getDefaultUncaughtExceptionHandler(). UncaughtException() wywoła własną metodę. – Hexise

0

Ten hack jest oparty na odpowiedzi Jamina i divona. Działa z Crashlytics i bez Crashlytics. Wywołaj tę metodę za pomocą metody Application onCreate(). Jeśli używasz Crashlytics, wywołaj tę metodę po zainicjowaniu Crashlytics. BTW, id wątku UI nie zawsze może być 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); 
     } 

    }); 
}