بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

cancel download

مدیریت گفتگو
alireza 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام

دوستان در پروژه دانلود استاد اگه بخوام با کلیک بری یک button  دانلود رو کنسل کنیم باید چکار کرد ؟ ممنون میشم راهنمایی کنید 

نظرات

raeesi 11 سال پیش
من خیلی دنبالش گشتم هر کاری کردم نشد جز این کد System.exit(0); چون ترد خورده تا کارشو به پایان نرسونه دست بر نمیداره:/
Spirit 11 سال پیش
«در تیتر سئوال نه آنقدر طولانی بنویسید که چند خطی شود و نه آنقدر کوتاه که معنی را نرساند. نمونه 300 سئوال اول، برای نوشتن تیتر سئوال الگوی خوبی است.»

پاسخ‌ها 6

Hajhosseini 11 سال پیش

راه های زیادی هست، ساده ترینش اینه که یک متغیر boolean ست کنید و زمانی که دکمه cancel کلیک شد یک متد در کلاس دانلودرتون کال بشه که کارش کنسل کردن اون متغیر باشه، زمانی که متغیر false باشه دانلود ادامه پیدا نمیکنه ولی چند تا کار باید انجام بشه. اول بستن input و outputStream هاست. و در آخر باید فایل رو پاک کنید.کلا کار خیلی ساده ایه اصلا سخت نگیرید.

نظرات

alireza 11 سال پیش
خیلیم ساده نبود :)) زحمت نمیشه کدهایی که باید اضافه بشه به پروژه استاد رو بنویسید من تازه کار رو شروع کردم و یکم با توضیحی که دادین درست متوجه نشدم دقیقا باید چیکار کنم ؟ ممنون میشم اگه کدهایی که می گید رو بنویسید math کردنش با کد استاد انجام میدم فقط اون خطهایی که باید اضافه بشه رو لطف کنید بنویسید ممنون میشم
Hajhosseini 11 سال پیش

من پروژه استاد دقیق یادم نیست ولی تا اونجایی که یادمه یک 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();
    }

فقط هندل کردن اینا باید درست انجام بشه. اینارو از یکی از پروژه های قدیمیم کپی کردم. من پیشنهاد میکنم اینارو کپی نکن، مطالعه کن و خودت پیاده سازیشون کن. زمانی که حرفه ای تر شدی میتونی از یه لیستنر ساده برای این کار استفاده کنی.

نظرات

MyNewName 11 سال پیش
شما فرض کنید 4-5 تا دانلود داره همزمان انجام میشه وقتی روی یه دکمه کنسل کلیک میشه ، از کجا ما به اون thread مورد نظر دسترسی پیدا کنیم ؟ مشکل همینه
Hajhosseini 11 سال پیش
بازم بستگی به نوع پیاده سازی داره. اگر دکمه های دانلود متفاوتند، خوب شما چون یک Instance جدید از دانلودر ساختی خودش به صورت اتوماتیک دانلودر مربوطه رو استاپ میکنه. چون داریم deleteFile رو روی همون instance کال میکنیم. ولی اگر داینامیک نوشتید و با کلیک روی یک دکمه چند فایل دانلود میشه باید یک آرایه از دانلودر هاتون داشته باشید و زمانی که میخواید کنسلشون کنید بگید دانلودر شماره 3 کنسل بشه.
alireza 11 سال پیش
بسیار ممنون خیلی لطف کردین
MyNewName 11 سال پیش
نه هر دکمه جداگانه عمل میکنه من وفتی یه downloader صدا میزنم مثلا شروع می کنه به دانلود در اکتیویتی های متفاوت میپرخیم و هنوز داره دانلود میکنه حالا قصد کنسل کردن داریم چطوری به اون دانلودر دسترسی پیدا کنیم ؟
Hajhosseini 11 سال پیش
اگر توی اکتیویتی های مختلف میگردید یکم داستانش فرق داره. باید یک List از دانلودر ها بسازید و در دانلودی که استارت میشه توی لیست اضافش کنید. وقتی میریم توی اکتیویتی های دیگه و برمیگردیم متغیر های ما دوباره initialize میشن پس اون آرایه باید استاتیک باشه، یک متد Get که شناسه اون دانلودر(مثلا نام یا آیدی فایلی که داره دانلود میکنه) لازم دارید که دانلودر هاتون رو چک کنید. ولی روش اصلی نوشتن اینجور دانلودر ها استفاده از سرویس هست. مثلا دانلودر بازار شما از برنامه خارج هم که بشید دانلود رو ادامه میده. میتونید همین کار هارو با استفاده از یک لیستنر یا آرایه ای از لیستنر ها انجام بدید.(اینایی که گفتم برای داینامیک نوشنت برنامست و اگر نخواید داینامیک باشه که خیلی راحت آرایه درست کنید و با زدن دکمه شماره 2 ، دانلودر دوم توی آرایه رو کنسل کنید)
غزل 11 سال پیش
آقای حاجی حسینی ممنون از راهنمایی هاتون من همه توضیحاتتونو کامل متوجه شدم اما تو کدی که نوشتین تو قسمت downloaddialog و downloaderCancel خطا میگیره لطفا یه توضیح در این باره بدین ممنون میشم
Hajhosseini 11 سال پیش

حاج حسینی هستم! 
downloadDialog برای اینه که من دانلودرمو توی دیالوگ نمایش میدادم و downloadCancel آیدی دکمه کنسل هست که توی xml تعریف شده. شما میتونید به این صورت بنویسید:

 findViewById(R.id.downloaderCancel).setOnClickListener(newView.OnClickListener(){
@Override
publicvoid onClick(View v){
downloadRequest.deleteFile(App.DIR_APP +"/"+ fileName);
}
});

نظرات

غزل 11 سال پیش
ممنون آقای حاج حسینی. اما این کد فقط فایل رو دیلیت میکنه و دانلود همچنان ادامه پیدا میکنه و کنسل نمیشه نمیدونم کجای کدم اشتباهه ببخشید هی سوال میکنم اخه این پروژه کارشناسی منه و هفته دیگه باید ارائه بدم بخاطر همین میخوام کاملش کنم
Hajhosseini 11 سال پیش

نه دیگه شما به اون flag دقت نکردی. خط اول متد deleteFile فلگ رو false میکنه، پس دانلود به صورت اتوماتیک کنسل میشه، و 2 خط زیر اجرا میشه:

  outputStream.close();///// bastane outputStream kheili moheme
inputStream.close();///// bastane inputStream be hamin surat

پس شما فقط کافیه فایل رو پاک کنی.

نظرات

غزل 11 سال پیش

به 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;

نظرات

Hajhosseini 11 سال پیش
احتمالا شما دانلودری که داره عملیات دانلود انجام میده رو کنسل نمیکنی، یک new میسازی و کنسل میکنی. کد های اکتیویتی تون رو قرار بدید لطفا(فقط قسمت ساختن دانلودر و کنسل کردنش رو)
غزل 11 سال پیش

سلام مجدد ببخشید باتاخیر جواب دادم قسمتی که دانلود رو انجام میده کدهاش اینه

 

   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);
                            }
                        });

نظرات

Hajhosseini 11 سال پیش
کدها قابل مشاهده نیست! لطفا دوباره ادیت کنید تا درست بشه(اگر نشد به مدیران سایت اعلام کنید)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .