我在我的日志中收到此异常:" clarifai2.exception.ClarifaiException:获取默认模型的最大尝试次数。"这是由我的大量Android应用程序用户生成的,但我无法复制异常或确定导致它的原因。有关如何重新创建甚至更好地防止此异常发生的任何帮助都将非常有用。
更新: 我发现了问题,并且能够按需重现,如果没有可用的互联网连接,Clarifai库会抛出此异常,则不会检查库中的网络连接状态。在构建clarifai客户端之前,我可以在我的应用程序中检查网络连接,但是如果在构建客户端后网络连接丢失,则生成此异常,有关如何防止此问题的任何想法?谢谢。
1 - 确保手机上有与互联网的数据连接。
2 - 在onCreate中构建clarifai客户端
3 - 向食品模型发送clarifai预测请求
4 - 禁用手机上的wifi和移动数据连接
5 - 等待10到15秒,可以导航到其他活动,然后clarifai抛出" Clarifai异常:获得默认模型的最大尝试次数"并崩溃了应用程序。
可以抛出此异常的Clarifai Library类可用HERE
我在请求活动的onCreate中调用了下面的buildClarifaiClient方法。
private void buildClarifaiClient(){
if(clarifaiClient == null){
clarifaiClient = new ClarifaiBuilder("KeyString")
.client(new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
//.addInterceptor(new HttpLoggingInterceptor(logger::info).setLevel(HttpLoggingInterceptor.Level.BASIC))
.build()
)
.buildSync();
}
}
拍摄照片后,请求对Clarifai的ActivityResult:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
if(clarifaiClient != null) {
snapSearchActivityResult = true;
taskClarifaiRequest = new AsyncTask<Void, Void, ClarifaiResponse<List<ClarifaiOutput<Concept>>>>() {
@Override
protected void onPreExecute() {
}
@Override
protected ClarifaiResponse<List<ClarifaiOutput<Concept>>> doInBackground(Void... params) {
// The default Clarifai model that identifies concepts in images
// Use this model to predict, with the image that the user just selected as the input
return clarifaiClient.getDefaultModels().foodModel().predict()
.withInputs(ClarifaiInput.forImage(ClarifaiImage.of(getPicByteData())))
.executeSync();
}
@Override
protected void onPostExecute(ClarifaiResponse<List<ClarifaiOutput<Concept>>> response) {
//setBusy(false);
if (!response.isSuccessful()) {
showErrorSnackbar(getString(R.string.clarifaiAPIContactError));
return;
}
final List<ClarifaiOutput<Concept>> predictions = response.get();
if (predictions.isEmpty()) {
showErrorSnackbar(getString(R.string.clarifaiAPIResultsError));
return;
}
List<Concept> concepts = predictions.get(0).data();
int conceptsSize = concepts.size();
Log.d("conceptsSize", String.valueOf(conceptsSize));
for (Concept c : concepts) {
// Do something with the value
Log.d("foodName", String.valueOf(c.name()));
Log.d("foodProb", String.valueOf(c.value()));
}
}
private void showErrorSnackbar(String errorString) {
Snackbar.make(
parentLayout,
errorString,
Snackbar.LENGTH_LONG
).show();
}
};
taskClarifaiRequest.execute();
} else {
Snackbar.make(
parentLayout,
"Unable to connect to Image API, try again.",
Snackbar.LENGTH_LONG
).show();
buildClarifaiClient();
}
}
堆栈跟踪:
Exception clarifai2.exception.ClarifaiException: Maximum attempts
reached of getting a default model.
clarifai2.dto.model.DefaultModels.update ()
clarifai2.dto.model.DefaultModels.access$000 ()
clarifai2.dto.model.DefaultModels$1.run ()
java.util.concurrent.ThreadPoolExecutor.runWorker
(ThreadPoolExecutor.java:1113)
java.util.concurrent.ThreadPoolExecutor$Worker.run
(ThreadPoolExecutor.java:588)
java.lang.Thread.run (Thread.java:818)
答案 0 :(得分:0)
我说你在这里使用的API密钥没有获取模型请求的权限。当您通过getDefaultModels()
访问食品模型时,首先更新模型(通过获取模型请求),然后才运行预测请求。如果第一个失败,则第二个失败,
在即将于下周发布的Java API客户端2.3中,调用getDefaultModels()
将不再启动获取模型请求,因为大多数情况下您只需要一个默认模型的ID,而不是完整的模型数据获得模型请求返回。由于只会执行预测请求,因此您无需获取API密钥的模型请求权限。
同时,你可以做两件事之一。之一:
DefaultModels.java
链接中看到)插入到预测电话中:client.predict("bd367be194cf45149e75f01d59f77ba7").withInputs(...).executeSync();
。