آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

cancel download

alireza  11 سال پیش  11 سال پیش
0 0

سلام

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

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

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

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

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

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

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

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

 findViewById(R.id.downloaderCancel).setOnClickListener(newView.OnClickListener(){
@Override
publicvoid onClick(View v){
downloadRequest.deleteFile(App.DIR_APP +"/"+ fileName);
}
});
0 0
ممنون آقای حاج حسینی. اما این کد فقط فایل رو دیلیت میکنه و دانلود همچنان ادامه پیدا میکنه و کنسل نمیشه نمیدونم کجای کدم اشتباهه ببخشید هی سوال میکنم اخه این پروژه کارشناسی منه و هفته دیگه باید ارائه بدم بخاطر همین میخوام کاملش کنم (11 سال پیش)
پاسخ به سوال 
Hajhosseini  11 سال پیش
+1 0

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

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

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

پاسخ به سوال 
غزل  11 سال پیش
0 0

به 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;
0 0
احتمالا شما دانلودری که داره عملیات دانلود انجام میده رو کنسل نمیکنی، یک new میسازی و کنسل میکنی. کد های اکتیویتی تون رو قرار بدید لطفا(فقط قسمت ساختن دانلودر و کنسل کردنش رو) (11 سال پیش)
پاسخ به سوال 
غزل  11 سال پیش
0 0

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

 

   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);
                            }
                        });
0 0
کدها قابل مشاهده نیست! لطفا دوباره ادیت کنید تا درست بشه(اگر نشد به مدیران سایت اعلام کنید) (11 سال پیش)

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