我有一个生产中的应用程序,在调用经过身份验证的云端点时收到大量强制/关闭。最能说明问题的是“ java.lang.IllegalArgumentException:服务未注册:com.google.android.gms.internal.es@4481e6a8”。 95% 的时间逻辑都正确。失败的堆栈跟踪如下:
java.lang.RuntimeException:执行时发生错误
doInBackground() 在 android.os.AsyncTask$3.done(AsyncTask.java:200) 在
java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
在 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 在
android.app.ActivityThread$PackageInfo.forgetServiceDispatcher(ActivityThread.java:1074)
在 android.app.ContextImpl.unbindService(ContextImpl.java:886) 处
android.content.ContextWrapper.unbindService(ContextWrapper.java:352)
在 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.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()(源文件:192)位于
com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.void
拦截(com.google.api.client.http.HttpRequest)(SourceFile:217)在
com.google.api.client.http.HttpRequest.com.google.api.client.http.HttpResponse
执行()(源文件:836)
com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse
执行未解析(布尔)(SourceFile:412)在
com.google.api.client.googleapis.services.AbstractGoogleClientRequest.com.google.api.client.http.HttpResponse
执行Unparsed()(源文件:345)在
com.google.api.client.googleapis.services.AbstractGoogleClientRequest.java.lang.Object
执行()(源文件:463)
com.jdub.empiretracker.EmpireTrackerActivity$QueryMarketStats.com.google.api.services.marketendpoint.model.Market
doInBackground(com.google.api.services.marketendpoint.model.Market[])(源文件: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 个
我的实现与 Google 示例非常一致。例如,我的 Android Activity 使用 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...
}
}
给出错误的行是:结果 = service.market().latest(state.getServerID()).execute();
我已验证 getServerID() 的参数返回可接受的值。我目前的理论是 Google Play 服务无法提供仍经过身份验证的帐户。尽管我无法重现,但我相信当应用程序进入睡眠状态时可能会出现该问题。因此我确认了我的 onResume() 逻辑,如下:
@Override
protected void onResume() {
super.onResume();
checkPlayServices();
isInFront = true;
}
还有什么可能导致这种间歇性故障?这是一个已知的问题?