实际上,我在应用中使用Retrofit2向服务器发送一些文本。
问题是当网络中断使我上线时我正在使用射频设备时失败应取消通话,但是一旦设备重新连接到网络,它似乎正在重新发送文本或类似内容该文本保留在队列中,我会处理。
这是我发送文本的方法(我尚未尝试在onFailure中使用call.cancel(),但无效)
@SuppressLint("DefaultLocale")
public void sendPost() {
@SuppressLint({"SdCardPath", "DefaultLocale"}) final File file = new File("/data/data/app/files/"+String.format("%03d", Integer.valueOf(nTerminalino))+"_"+nTavoli.getText().toString()+".txt");
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
RequestBody fbody = RequestBody.create(MediaType.parse("text/*"), file);
builder.addFormDataPart(String.format("%03d", Integer.valueOf(nTerminalino))+"_"+nTavoli.getText().toString(), file.getName(),fbody);
MultipartBody requestBody = builder.build();
final APIService apiService = ApiUtils.getAPIService(ipCASSA);
final Call<Void> calls = apiService.savePost(requestBody);
calls.enqueue(new Callback<Void>() {
@Override
public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
if (response.isSuccessful()) {
Log.i("RESPONSE: ", response.toString());
Print();
file.delete();
dialogLoading.dismiss();
Runtime.getRuntime().gc();
}else {
calls.cancel();
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
Log.e("TAG", t.toString());
MediaPlayer mpFound = MediaPlayer.create(pterm.this, R.raw.errorsound);
mpFound.start();
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if (v.hasVibrator()) {
v.vibrate(6000);
}
new GlideToast.makeToast(pterm.this, "CONNESSIONE FALLITA!", GlideToast.LENGTHLONG, GlideToast.FAILTOAST).show();
dialogLoading.dismiss();
}
});
}
在我正在构建OkHttpClient的班级中,我已经设置了retryOnConnectionFailure(false),但仍然无法解决即使onFailure我也收到POST请求的问题。
更新:
经过研究,我发现OkHttp在连接失败时对POST进行静默重试。
那么我如何防止客户端重试?
某些信息:
我的应用程序是用于服务员的应用程序,因此当我收到onFailure
消息时,我通知服务员该收据尚未由POS接收并且尚未打印,而是以{{1} }仍然尝试发送文件,并且我强迫服务员在OkHttpClient
导致打印重复的收据之后重新发送收据。
这是我的ApiUtils类,APIService接口和RetrofitClient类
onFailure
答案 0 :(得分:0)
由于retryOnConnectionFailure(false)
没有帮助,因此问题不是由OKHttp重试引起的。
我怀疑您正在复制请求。检查sendPost()
是否被多次调用。
答案 1 :(得分:0)
您可以尝试直接取消通话。因此,当呼叫失败时,您可以在onFailure
回调中执行类似的操作
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
if (!call.isCanceled()) {
// Do receipt logic
call.cancel();
}
}