我的日志中出现此异常:“clarifai2.exception.ClarifaiException:获得默认模型的最大尝试次数。” 这是由我的大量 android 应用程序用户生成的,但我无法复制异常或确定导致它的原因。有关如何重新创建甚至更好地防止此异常发生的任何帮助都将非常有帮助。
更新:我发现了问题并且能够按需重现,如果没有可用的 Internet 连接,Clarifai 库会抛出此异常,则不会检查库内的网络连接状态。我可以在构建 clarifai 客户端之前检查我的应用程序中的网络连接,但是如果在构建客户端后网络连接丢失,则会生成此异常,关于如何防止这种情况的任何想法?谢谢你。
1 - 确保手机上可以连接到互联网的数据。
2 - 在 onCreate 中构建 clarifai 客户端
3 - 向食物模型发送 clarifai 预测请求
4 - 禁用手机上的 wifi 和移动数据连接
5 - 等待 10 到 15 秒,可以导航到其他活动,然后 clarifai 抛出“Clarifai 异常:获取默认模型的最大尝试次数”并使应用程序崩溃。
可以在此处获得可以抛出此异常的 Clarifai 库类
我在请求活动的 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();
}
}
拍照后在 ActivityResult 上向 Clarifai 请求:
@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)