4

認証済みのクラウド エンドポイントを呼び出すと、多数の強制終了/強制終了を受け取るアプリケーションが本番環境にあります。最もわかりやすいメッセージは" java.lang.IllegalArgumentException: Service not registered: com.google.android.gms.internal.es@4481e6a8"です。ロジックは 95% の確率で正しく機能します。障害のスタック トレースは次のとおりです。

java.lang.RuntimeException: java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) で android.os.AsyncTask$3.done(AsyncTask.java:200) で doInBackground() を実行中にエラーが発生しましたjava.util.concurrent.FutureTask.setException(FutureTask.java:124) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) で java.util.concurrent.FutureTask.run(FutureTask.java: 137) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) で java.lang.Thread.run(Thread.java) :1096) 原因: java.lang.IllegalArgumentException: サービスが登録されていません: com.google.android.gms.internal.es@4481e6a8 at android.app.ActivityThread$PackageInfo.forgetServiceDispatcher(ActivityThread.java:1074) at android.android.content.ContextWrapper.unbindService(ContextWrapper.java:352) の app.ContextImpl.unbindService(ContextImpl.java:886) .Context,java.lang.String,java.lang.String)(不明なソース) java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun で(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で com.google. android.gms.auth.GoogleAuthUtil.java.lang.String getToken(android.content.Context,java.lang.String,java.lang.String)(ソース不明) java.util.concurrent.FutureTask$Sync.innerRun( FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で com.google.api.client.googleapis .extensions.android.gms.auth.GoogleAccountCredential.java.lang.String getToken()(SourceFile:192) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.void interrupt( com.google.api.client.http.HttpRequest)(SourceFile:217) at com.google.api.client.http.HttpRequest.com.google.api.client.http.HttpResponse execute()(SourceFile:836) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse executeUnparsed(boolean)(SourceFile:412) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com .google.api.client.http.HttpResponse executeUnparsed()(SourceFile:345) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.java.lang.Object execute()(SourceFile:463) at com.jdub.empiretracker.EmpireTrackerActivity$QueryMarketStats.com. google.api.services.marketendpoint.model.Market doInBackground(com.google.api.services.marketendpoint.model.Market[])(SourceFile:355) com.jdub.empiretracker.EmpireTrackerActivity$QueryMarketStats.java.lang.Object でdoInBackground(java.lang.Object[])(SourceFile:1) で android.os.AsyncTask$2.call(AsyncTask.java:185) で java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) で... 4 つ以上EmpireTrackerActivity$QueryMarketStats.com.google.api.services.marketendpoint.model.Market doInBackground(com.google.api.services.marketendpoint.model.Market[])(SourceFile:355) com.jdub.empiretracker.EmpireTrackerActivity$QueryMarketStats で.java.lang.Object doInBackground(java.lang.Object[])(SourceFile:1) で android.os.AsyncTask$2.call(AsyncTask.java:185) で java.util.concurrent.FutureTask$Sync.innerRun( FutureTask.java:305) ... 4 つ以上EmpireTrackerActivity$QueryMarketStats.com.google.api.services.marketendpoint.model.Market doInBackground(com.google.api.services.marketendpoint.model.Market[])(SourceFile:355) com.jdub.empiretracker.EmpireTrackerActivity$QueryMarketStats で.java.lang.Object doInBackground(java.lang.Object[])(SourceFile:1) で android.os.AsyncTask$2.call(AsyncTask.java:185) で java.util.concurrent.FutureTask$Sync.innerRun( FutureTask.java:305) ... 4 つ以上さらに4さらに4

私の実装は、Google のサンプルと非常に一致しています。たとえば、私の Android アクティビティでは、次のように AsyncTask を使用して呼び出しを行っています。

    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...
    }

}

エラーが発生する行は次のとおりです。 result = service.market().latest(state.getServerID()).execute();

getServerID() のパラメーターが許容できる値を返していることを確認しました。この時点での私の理論は、Google Play Services はまだ認証されているアカウントを提供できないというものです。再現できませんでしたが、アプリケーションがスリープ状態になったときに問題が発生する可能性があると思います。したがって、次のように onResume() ロジックを確認しました。

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

他に何がこの断続的な障害を引き起こす可能性がありますか? これは既知の問題ですか?

4

1 に答える 1

2

より良い代替手段の代わりに、例外をキャッチし、再試行をトリガーして成功させています。エンドポイントが呼び出された時点でサービスが登録されない原因となっている断続的な問題が何であれ、それ以降のサービスの呼び出しは適切に機能します。

回避策コード

@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(e);
    }
    catch (GoogleAuthIOException e) {
        Log(e);
    }
    catch (IOException e) {
        Log(e);
    }
    catch (IllegalArgumentException e) {
        // This caused a lot of intermittent force/closes.
        Log(e);
    }

    return result;
}

@Override
protected void onPostExecute(com.google.api.services.marketendpoint.model.Market result) {

    DismissProgressDialogIfPresent();

    com.google.api.services.marketendpoint.model.Market m = (com.google.api.services.marketendpoint.model.Market) result;

    if( m == null)
    {
        // Verify the current activity is active
        if( isInFront ) {

            // Present a retry/cancel dialog
            AlertDialog.Builder builder = new AlertDialog.Builder(EmpireTrackerActivity.this);
            builder.setMessage("An error was encountered retrieving the latest market data.\n\nPlease verify you are connected to the Internet.");
            builder.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                    m_ProgressDlg = ProgressDialog.show(EmpireTrackerActivity.this, "Please wait...", "Retrieving data ...", true);
                    new QueryMarketStats().execute();
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                    dialog.dismiss();
                }
            });
            AlertDialog alert = builder.create();
            alert.show();
        }

        return;
    }

    // Process newly posted data            
    state.setMarketObj(m);
    state.setIsInitialized(true);
    state.WriteFile(EmpireTrackerActivity.this);

    super.onPostExecute(result);
}       

}

于 2013-06-10T14:52:42.467 に答える