如何在失败时取消所有排队的请求?(改装2)



实际上,我在我的应用程序中使用Reformation2向服务器发送一些文本。

问题是,当我使用射频设备时,网络中断,所以我接通了故障,呼叫应该被取消,但一旦设备重新连接到网络,它似乎正在重新发送文本或类似文本的东西,并保留在队列中,我会处理它。

这是我发送文本的方法(我还尝试过在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尚未收到收据,并且尚未打印,但由于OkHttpClient仍在尝试发送文件,并且我正在强制服务生在onFailure之后重新发送收据,这会导致打印重复的收据

这是我的ApiUtils类、APIService接口和改装客户端类

class ApiUtils {
private ApiUtils() {}

static APIService getAPIService(String ipCASSA) {
String BASE_URL = "http://"+ipCASSA+"/web/";
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.writeTimeout(10000, TimeUnit.MILLISECONDS)
.readTimeout(10000, TimeUnit.MILLISECONDS)
.retryOnConnectionFailure(false)
.build();

return RetrofitClient.getClient(BASE_URL,okHttpClient).create(APIService.class);
}
}
public interface APIService {
@POST("CART=PTERM")
Call<Void> savePost(@Body RequestBody text);
}
class RetrofitClient {
private static Retrofit retrofit = null;

static Retrofit getClient(String baseUrl, OkHttpClient okHttpClient) {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}

您可以尝试直接取消调用。因此,当调用失败时,在onFailure回调中,您可以执行类似的操作

@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
if (!call.isCanceled()) {
// Do receipt logic
call.cancel();
}
}

由于retryOnConnectionFailure(false)没有帮助,所以问题不是由OKHttp重试引起的。

我怀疑你在重复请求。检查sendPost()是否被多次调用。

最新更新