Android 如何正确管理改装后申请?
事实上,我正在尝试将一个文本文件发送到我的服务器,当我发送文件时,我可以处理错误,但如果文件已发送,我没有得到响应。网络中断,因此服务器收到了文件,但设备不知道 因为现在我遇到了一个问题,因为如果我在设备返回在线时没有收到响应,它会再次发送相同的文件,我会阻止它 似乎是在连接失败或类似情况下重试发送文件 以下是我使用onClick发送文件的方法:Android 如何正确管理改装后申请?,android,http,retrofit,okhttp,Android,Http,Retrofit,Okhttp,事实上,我正在尝试将一个文本文件发送到我的服务器,当我发送文件时,我可以处理错误,但如果文件已发送,我没有得到响应。网络中断,因此服务器收到了文件,但设备不知道 因为现在我遇到了一个问题,因为如果我在设备返回在线时没有收到响应,它会再次发送相同的文件,我会阻止它 似乎是在连接失败或类似情况下重试发送文件 以下是我使用onClick发送文件的方法: public void sendPost() { @SuppressLint({"SdCardPath", "DefaultLoca
public void sendPost() {
@SuppressLint({"SdCardPath", "DefaultLocale"}) final File file = new File("/data/data/com.example.igardini.visualposmobile/files/"+String.format("%03d", Integer.valueOf(nTerminalino))+"_"+nTavoli.getText().toString()+".txt");
final MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
final RequestBody fbody = RequestBody.create(MediaType.parse("text/*"), file);
builder.addFormDataPart(String.format("%03d", Integer.valueOf(nTerminalino))+"_"+nTavoli.getText().toString(), file.getName(),fbody);
final 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();
dialogLoading.dismiss();
Runtime.getRuntime().gc();
// checkFile task = new checkFile();
// task.execute();
}else {
Toast.makeText(pterm.this,"ERRORE",Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
if(t instanceof IOException) {
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();
}
}
});
}
以下是我的其他有用的课程:
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;
}
}
在这种情况下,我会向文件中添加某种设备生成的随机ID,并将其与请求一起发送 在服务器端,我会改变逻辑,首先尝试使用这个ID在DB中定位文件,如果没有,则存储它并返回状态OK,以及服务器端ID可能稍后会派上用场 若请求中提供了ID为的文件,只需返回状态为200的服务器端ID,这样您就不会存储它两次 你们甚至可以更进一步——若你们并没有稳定的连接,从描述上看,你们甚至可以单独调用REST,通过生成的id或校验和来检查文件是否在服务器端,若并没有,那个么就开始发送——它将是安全的 它不必生成ID,例如,它可以是文件的校验和。只要对你更容易 为了生成ID,您可以使用Android的UUID 有关校验和,请检查以下答案:
顺便说一句-我不会做10秒超时限制-这太多了,用户体验会很糟糕事实上,问题是我没有将任何文件保存到数据库以检查文件是否存在。这是一个服务生应用程序,我只发送了一个带有收据的.txt文件,然后当POS机收到并打印文件时,该文件被删除。您可以将UUID存储在POS数据库中,或者甚至存储在内存中,在收到邮件20秒后将邮件清理干净,以便有时间打印邮件,这样恐怕就没有了。对于REST,我们只能将回复作为发送确认。您必须了解REST是如何工作的,直到超时,或者响应连接处于活动状态。你应该利用超时、连接时间和读取超时来找到适合你的东西。我将从默认值开始——为此,只需删除这些行,看看它是如何工作的。否。根据您在评论中的描述,我可以告诉您,POS上的prolly实现是错误的,但您也说您对此无能为力。所以是的-在每个HTTP客户机上,您都会遇到相同的问题。玩那些超时-从默认开始,看看这是否正常。我相信应该没问题