cancel download
سلام
دوستان در پروژه دانلود استاد اگه بخوام با کلیک بری یک button دانلود رو کنسل کنیم باید چکار کرد ؟ ممنون میشم راهنمایی کنید
راه های زیادی هست، ساده ترینش اینه که یک متغیر boolean ست کنید و زمانی که دکمه cancel کلیک شد یک متد در کلاس دانلودرتون کال بشه که کارش کنسل کردن اون متغیر باشه، زمانی که متغیر false باشه دانلود ادامه پیدا نمیکنه ولی چند تا کار باید انجام بشه. اول بستن input و outputStream هاست. و در آخر باید فایل رو پاک کنید.کلا کار خیلی ساده ایه اصلا سخت نگیرید.
من پروژه استاد دقیق یادم نیست ولی تا اونجایی که یادمه یک while توی دانلودر داره که اونجا fileOutputStream پر میشه. خوب شما توی اون while یک شرط به صورت زیر اضافه کن و همه کد ها رو توی اون شرط بذار
while (downloadFlag == true && ((len = inputStream.read(buffer)) > 0)) {
outputStream.write(buffer, 0, len);
downloadedSize += len;
percent = (int) (100.0f * (float) downloadedSize / totalSize);
if (listener != null) {
final int finalDownloadedSize = downloadedSize;
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
App.HANDLER.post(new Runnable() {
@Override
public void run() {
listener.onProgressDownload(percent, finalDownloadedSize, totalSize);
}
});
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread1.start();
}
}
outputStream.close(); ///// bastane outputStream kheili moheme
inputStream.close(); ///// bastane inputStream be hamin surat
} catch (MalformedURLException e) {
deleteFile(downloadPath);
e.printStackTrace();
} catch (IOException e) {
deleteFile(downloadPath);
e.printStackTrace();
}
downloadFlag رو در بالا به صورت public تعریف کن (نباید استاتیک باشه).
شما توی اکتیویتی به این صورت دانلود رو انجام میدادی درسته؟
final DownloadRequest downloadRequest = new DownloadRequest()
.listener(listener)
.downloadPath(item.url)
.filepath(App.DIR_APP + "/" + fileName)
downloadRequest.download(item.size);
حالا کد من یکم متفاوته، ولی بعد از این کد باید اینو بنویسی:
downloadDialog.findViewById(R.id.downloaderCancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
downloadRequest.deleteFile(App.DIR_APP + "/" + fileName);
}
});
توی دانلودرت هم باید متد deleteFile رو به این صورت اضافه کنی:
public void deleteFile(String filepath) {
downloadFlag = false;
File file = new File(filepath);
if (file.exists())
file.delete();
}
فقط هندل کردن اینا باید درست انجام بشه. اینارو از یکی از پروژه های قدیمیم کپی کردم. من پیشنهاد میکنم اینارو کپی نکن، مطالعه کن و خودت پیاده سازیشون کن. زمانی که حرفه ای تر شدی میتونی از یه لیستنر ساده برای این کار استفاده کنی.
حاج حسینی هستم!
downloadDialog برای اینه که من دانلودرمو توی دیالوگ نمایش میدادم و downloadCancel آیدی دکمه کنسل هست که توی xml تعریف شده. شما میتونید به این صورت بنویسید:
findViewById(R.id.downloaderCancel).setOnClickListener(newView.OnClickListener(){
@Override
publicvoid onClick(View v){
downloadRequest.deleteFile(App.DIR_APP +"/"+ fileName);
}
});
نه دیگه شما به اون flag دقت نکردی. خط اول متد deleteFile فلگ رو false میکنه، پس دانلود به صورت اتوماتیک کنسل میشه، و 2 خط زیر اجرا میشه:
outputStream.close();///// bastane outputStream kheili moheme
inputStream.close();///// bastane inputStream be hamin surat
پس شما فقط کافیه فایل رو پاک کنی.
به flag دقت کردم اما دانلود کنسل نمیشه و تا اخر ادامه پیدا میکنه .اینم کدهام
public void deleteFile(String filePath) {
downloadFile = false;
File file = new File(filePath);
if (file.exists()) {
file.delete();
}
}
public DownloadRequest download() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
URL url;
try {
url = new URL(downloadPath);
try {
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();
fileSize = connection.getContentLength();
FileOutputStream outputStream = new FileOutputStream(filePath);
InputStream inputStream = connection.getInputStream();
byte[] buffer = new byte[4 * 1024];
int len = 0;
while (downloadFile == true && (len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
downloadedSize += len;
percent = (downloadedSize / fileSize) * 100.0f;
if (listenerProgress != null) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
listenerProgress.downloadProgress(percent, connection);
}
});
}
if (percent == 100) {
if (listener != null) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
listener.onDownloadComplete(downloadPath, filePath);
}
});
}
}
}
outputStream.close();
inputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
catch (MalformedURLException e) {
e.printStackTrace();
}
}
});
thread.start();
return this;
سلام مجدد ببخشید باتاخیر جواب دادم قسمتی که دانلود رو انجام میده کدهاش اینه
btnInstall.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String fileName = HelperString.getFileName(G.selectedStructApplication.file);
final DownloadRequest downloadRequest = new DownloadRequest()
.downloadPath("http://192.168.1.65/market-server/" + G.selectedStructApplication.file)
.filePath(G.DIR_APK + "/" + fileName)
.download()
.listenerProgress(new onDownloadProgress() {
@Override
public void downloadProgress(float percent, final HttpURLConnection connection) {
btnInstall.setText("لغو");
prgDownload.setVisibility(View.VISIBLE);
prgDownload.setProgress((int) percent);
txtPercent.setText((int) percent + "%");
txtPrice2.setText("در حال دریافت ...");
}
})
.listener(new OnDownloadCompletelistener() {
@Override
public void onDownloadComplete(String url, String localPath) {
prgDownload.setVisibility(View.VISIBLE);
txtPrice2.setText(getString(R.string.price));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(localPath)), "application/vnd.android.package-archive");
startActivity(intent);
}
});
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .