Uwierzytelniony punkt końcowy chmury przerywany błąd klienta Android

Mam w produkcji aplikację, która otrzymuje znaczną liczbę sił / zamknięć podczas wywoływania uwierzytelnionego punktu końcowego chmury. Najbardziej wymowna wiadomość„java.lang.IllegalArgumentException: Usługa nie jest zarejestrowana: com.google.android.gms.internal.es@4481e6a8”. Logika działa poprawnie w 95% przypadków. Ślad stosu awarii jest następujący:

java.lang.RuntimeException: Wystąpił błąd podczas wykonywania doInBackground () w android.os.AsyncTask $ 3.done (AsyncTask.java:200) w java.util.concurrent.FutureTask $ Sync.innerSetException (FutureTask.java:273) w java.util.concurrent.FutureTask.setException (FutureTask.java:124) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:307) w java.util.concurrent.FutureTask.run (FutureTask.java: 137) w java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1068) w java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:561) w java.lang.Thread.run (Thread.java : 1096) Przyczyna: java.lang.IllegalArgumentException: Usługa nie jest zarejestrowana: com.google.android.gms.internal.es@4481e6a8 w android.app.ActivityThread $ PackageInfo.forgetServiceDispatcher (ActivityThread.java:1074) w android.app .ContextImpl.unbindService (ContextImpl.java:886) w android.content.ContextWrapper.unbindService (ContextWrapper.java:352) na com.google.android.gms.auth.GoogleAuthUt il.java.lang.String getToken (android.content.Context, java.lang.String, java.lang.String) (Nieznane źródło) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w com.google.android.gms.auth.GoogleAuthUtil.java.lang.String getToken (android.content.Context, java.lang.String, java.lang.String) (Nieznane źródło) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun ( FutureTask.java:305) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) na com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.java.lang. String getToken () (SourceFile: 192) na com.google.api.client.googleapis.extensions.android.gm s.auth.GoogleAccountCredential $ RequestHandler.void intercept (com.google.api.client.http.HttpRequest) (SourceFile: 217) na com.google.api.client.http.HttpRequest.com.google.api.client.http .HttpResponse execute () (SourceFile: 836) na com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed (boolean) (SourceFile: 412) na com.google. api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed () (SourceFile: 345) w com.google.api.client.googleapis.services.AbstractGoogleClientRequest.java.lang.Object wykonaj () (SourceFile: 463) na com.jdub.empiretracker.EmpireTrackerActivity $ QueryMarketStats.com.google.api.services.marketendpoint.model.Market doInBackground (com.google.api.services.marketendpoint.model.Market []) ( SourceFile: 355) na com.jdub.empiretracker.EmpireTrackerActivity $ QueryMarketStats.java.lang.Object doInBackground (java.lang.Object []) (SourceFile: 1) w android.os.AsyncTask $ 2.call (AsyncTask.java:185) w java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) ... 4 więcej

Moja implementacja jest bardzo spójna z przykładami Google. Na przykład moja aktywność w systemie Android polega na użyciu AsyncTask do wykonania połączenia w następujący sposób:

    private class QueryMarketStats extends AsyncTask<com.google.api.services.marketendpoint.model.Market, com.google.api.services.marketendpoint.model.Market, com.google.api.services.marketendpoint.model.Market> {

    /* (non-Javadoc)
     * @see android.os.AsyncTask#doInBackground(Params[])
     */
    @Override
    protected com.google.api.services.marketendpoint.model.Market doInBackground(com.google.api.services.marketendpoint.model.Market...markets) {

        com.google.api.services.marketendpoint.model.Market result = null;

        try {
            result = service.market().latest(state.getServerID()).execute();
        }
        catch (SSLException e) {
            PrimeDataStore();
            Log.d("app", e.getMessage(), e);
        }
        catch (GoogleAuthIOException e) {
            Log.d("app", e.getMessage(), e);
        }
        catch (IOException e) {
            Log.d("app", e.getMessage(), e);
        }

        return result;
    }

    /* (non-Javadoc)
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     */
    @Override
    protected void onPostExecute(com.google.api.services.marketendpoint.model.Market result) {

        // Process result...
    }

}

Wiersz zawierający błąd:result = service.market (). latest (state.getServerID ()). execute ();

Sprawdziłem, że parametr getServerID () zwraca wartość, która jest akceptowalna. Moim zdaniem w tym momencie usługi Google Play nie są w stanie zapewnić konta, które jest nadal uwierzytelnione. Chociaż nie mogłem się odtworzyć, uważam, że problem może wystąpić, gdy aplikacja przejdzie w stan uśpienia. Dlatego potwierdziłem moją logikę onResume () w następujący sposób:

    @Override
protected void onResume() {
    super.onResume();
    checkPlayServices();
    isInFront = true;
}

Co jeszcze może spowodować tę sporadyczną awarię? Czy to znany problem?

questionAnswers(1)

yourAnswerToTheQuestion