我有一个应用程序,可以使用Retrofit从服务器上下载文件.....在我的xml布局上,如果单击两个按钮,它们会发送不同的参数以下载不同的文件 这部分工作正常,我单击一个,程序开始忽略文件和其他按钮,当第一个文件完成时,它将下载第二个文件。我也有一个 取消按钮(取消下载)的问题是,取消按钮只能使用一次,我认为是因为每次它创建一个具有其ID的新“下载”。
因此,如果我单击下载1,然后下载2,然后单击取消,那么我只能取消下载2。
我的问题是,可以确定要取消的文件吗?
<Button
android:id="@+id/btn_download"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="128dp"
android:layout_marginLeft="128dp"
android:layout_marginTop="36dp"
android:text="Download"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_download2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="128dp"
android:layout_marginLeft="128dp"
android:layout_marginTop="124dp"
android:text="Download 2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="140dp"
android:layout_marginLeft="140dp"
android:layout_marginTop="196dp"
android:text="Cancel"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
private void downloadFile(final String fileName, String f_id, final String id) {
Retrofit.Builder builder = new Retrofit.Builder().baseUrl("mywebsite/api/")
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.build();
FileDownloadClient fileDownloadClient = retrofit.create(FileDownloadClient.class);
final String fileName = fileName;
final String f_id = f_id;
Map<String, Object> postdata = new HashMap<>();
postdata.put("Parametros", "aquii")
postdata.put("Parametros", "aquii")
postdata.put("Parametros", "aquii")
final Call<ResponseBody> call = fileDownloadClient.downloadFileStream(postdata);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, final Response<ResponseBody> response) {
sendOnChannel2("Download", "Download in progress", 2000, id);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
boolean success = writeResponseBodyToDisk(response.body(), fileName, id);
runOnUiThread(new Runnable() {
@Override
public void run() {
cancelButton.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, "Download Complete", Toast.LENGTH_LONG).show();
}
});
return null;
}
}.execute();
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
if(call.isCanceled()) {
Toast.makeText(MainActivity.this, "Request Cancelled :( ", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "Download failed :(", Toast.LENGTH_LONG).show();
}
}
});
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
call.cancel();
cancelNotification("Download", "Download cancelled", 0, id);
}
});
}