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

نمایش دانلود فایل در دیالوگ ( تورو خدا اگه کسی میدونه کمک کنه  )

ba2ever  10 سال پیش  10 سال پیش
0 0

با سلام خدمت دوستان و اساتید بزرگوار . راسش  سعی میکنم به صورت کامل مشکلمو بگم امیدوارم که کمکم کنید .

 فرض کنید توو پروژه ی مارکت استاد بعد ازین که رو دکمه ی (( نصب )) کلیک شد انتطار این رو داشته باشیم که روند انجام دانلود رو درون یک دیالوگ به شکل زیر  داشته باشیم.

                                  

به همین منظور من کارهایی رو که انجام دادم رو  تک تک شرح میدم ,  امیدوارم که مشکلم رو با کمک شما حل کنم .

من اومدم در کلاس DownloadRequest   یک سری کد به این کلاس اضافه کردم که این بخش ها ی اضافه شده رو پایین مشخص کردم

   
public class DownloadRequest {
private int downloadedSize; private int totalSize; private int percent; public int getDownloadedSize() { return downloadedSize; } public int getTotalSize() { return totalSize; } public int getPercent() { return percent; } public DownloadRequest download() { Thread thread = new Thread(new Runnable() { @Override public void run() { try { URL url = new URL(downloadPath); final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); connection.connect(); totalSize = connection.getContentLength(); File file = new File(filepath); if (file.exists()) { file.delete(); } FileOutputStream outputStream = new FileOutputStream(filepath); InputStream inputStream = connection.getInputStream(); byte[] buffer = new byte[G.DOWNLOAD_BUFFER_SIZE]; int len = 0; while ((len = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, len); downloadedSize += len; percent = (int) (100.0f * (float) downloadedSize / totalSize); if (progressListener != null) { ============================================>> کد مربوط به نمایش پروگرسبار در دیالوگ final int finalDownloadedSize = downloadedSize; ===============================>> کد مربوط به نمایش پروگرسبار در دیالوگ
G.HANDLER.post(new Runnable() { ============================================>> کد مربوط به نمایش پروگرسبار در دیالوگ
@Override ============================================>> کد مربوط به نمایش پروگرسبار در دیالوگ public void run() { ============================================>> کد مربوط به نمایش پروگرسبار در دیالوگ progressListener.onProgressDownload(percent, finalDownloadedSize, totalSize); >> کد مربوط به نمایش پروگرسبار در دیالوگ
} }); } if (percent == 100 && listener != null) { G.HANDLER.post(new Runnable() { @Override public void run() { listener.onDownloadComplete(downloadPath, filepath); } }); } if (simulate) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } outputStream.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); thread.start(); return this; } private String downloadPath; private String filepath; private OnDownloadCompleteListener listener; private OnProgressDownloadListener progressListener; ============>>> کد مربوط به نمایش پروگرسبار در دیالوگ private boolean simulate; public DownloadRequest downloadPath(String value) { downloadPath = value; return this; } public DownloadRequest filepath(String value) { filepath = value; return this; } public DownloadRequest listener(OnDownloadCompleteListener value) { listener = value; return this; } public DownloadRequest progressListener(OnProgressDownloadListener value) { ============>> کد مربوط به نمایش پروگرسبار در دیالوگ progressListener = value; return this; } public DownloadRequest simulate(boolean value) { simulate = value; return this; } }

بعد ازین کار اومد در جایی که قراره دانلود صورت بگیره  در متد دیزاین پترن بیلدر  ((  listener .  ))  و ((  progressListen .  )) رو  به متد دانلودم مطابق دستور زیر اضافه کردم.

   public static void DownloadFile() {
        final String filename = HelperString.getFileName(G.selectedMusic.file);

        DownloadRequest downloadRequest = new DownloadRequest()
                .downloadPath("http://192.168.1.105/Folkolor/" + G.selecteFile.file)
                .filepath(G.DIR_App + "/" + filename)

                .listener(new OnDownloadCompleteListener() {     ====== >>  این قسمت به درستی کار میکنه 

                    @Override     ====== >>  این قسمت به درستی کار میکنه 
                    public void onDownloadComplete(String url, String localPath) {     ====== >>  این قسمت به درستی کار میکنه 
                        File file = new File(localPath);   ====== >>  این قسمت به درستی کار میکنه 
                        new File(G.DIR_File + "/" + filename).exists();    ====== >>  این قسمت به درستی کار میکنه 

                    }

                })
                .progressListener(new OnProgressDownloadListener() {   ============>> مشکل من در اینجاست
 
                    @Override
                    public void onProgressDownload(int percent, int finalDownloadedSize, int totalSize) {  ============>> مشکل من در اینجاست
super.onProgressDownload(percent, finalDownloadedSize, totalSize); ============>> مشکل من در اینجاست
ProgressDialog barProgressDialog = new ProgressDialog(G.currentActivity);============>> مشکل من در اینجاست barProgressDialog.setTitle("Downloading Music ...");============>> مشکل من در اینجاست barProgressDialog.setMessage("Downloaded File ...");============>> مشکل من در اینجاست barProgressDialog.setProgressStyle(barProgressDialog.STYLE_HORIZONTAL);============>> مشکل من در اینجاست barProgressDialog.setProgress((int) percent);============>> مشکل من در اینجاست barProgressDialog.show();============>> مشکل من در اینجاست
} }) .download(); }

راسش نمیدونم چطوری باید این دیالوگ رو نشون بدم که  دقیقا همین اطلاعات زیر رو که در عکس هست بم نشون بده

                                       

ممنون میشم اگه کد هایی رو که میدونید در اختیارم بزارید. ی ماهه سر این قضیه موندم

0 0
. (10 سال پیش)
0 0
. (10 سال پیش)
0 0
. (10 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
صادقی راد  10 سال پیش
+3 0

با سلام

منم دقیقا مدتی پیش همین مشکل رو داشتم که خوشبختانه تونستم رفعش کنم!!!

کاری که بنده کردم این بود که به جای Progress Dialog یه دیالوگ معمولی گذاشتم و اونو طبق سلیقه خودم طراحی کردم و بعد چون Listener مدام تکرار میشه ، میشه حدس زد که هم دیالوگ موردنظر شما و هم تعریفاتی که کردین چندین بار رخ میده و چندین دیالوگ باز میشه و یا ایجاد کرش میکنه ، شما میتونین برای رفع این مشکل یک متغیر Boolean برای تعریف متغیر های خودتون بگیرین و بعد از نخستین تعریف اون رو برابر false قرار بدین تا دفعات بعدی تکرار نشن .

بنده کد خودم رو قرار میدم ، شما بسته به برنامه خودتون تغییرش بدین ، کد زیر داخل OnClickListener نوشته شده.

موفق باشید./

 OnProgressDownloadListener listener = new OnProgressDownloadListener() {

@Override
public void onProgressDownload(int percent, int downloadedSize, int fileSize) {
if (StartDefine)
{
Dialog dialog = new Dialog(G.crnt);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_download);
txtDownload = (TextView) dialog.findViewById(R.id.txtDownload);
prgDownload = (ProgressBar) dialog.findViewById(R.id.prgDownload);
dialog.show();
StartDefine = false;
}
prgDownload.setProgress(percent);
txtDownload.setText(percent + "%");
}
};

StartDefine = true;
FileDownloader.download("SOME_FILE", listener);
0 0
(10 سال پیش)
0 0
(10 سال پیش)
0 0
داداش میشه یکم بیشتر توضیح بدی (10 سال پیش)
0 0
تو پروژه مارکت چطور میشه استفاده کرد ؟ (10 سال پیش)
پاسخ به سوال 
ba2ever  10 سال پیش
0 0

علی جان مرسی از راهنمایت اما من هنوز مشکل دارم  . من چون از دیزاین پترن بیلدر که استاد آموزش دادند دارم استفاده میکنم  راسش  هنوز نتونستم این قسمت رو   که اگه اشتباه نکنم برای حالت عادی (( غیر دیزاین پترن)) هست رو حل کنم ====>>    ;(FileDownloader.download("SOME_FILE", listene
                ****************************************************************************

راسش من کد هامو به این شکل تغییر دادم که اومد ی کلاس به نام   Dilaogs  درست کردم و کد های مربوط به نمایش دانلود در دیالوگ رو که به کمک پروگرس بار روند نمایش دانلود رو که در بر داره , درش قرار دادم  و توو کلاس مربوطه تحت نام  ActivityMusicdetail  اونو صدا زدم  اما بازم داره ارور میده و نمیدونم داستانش چیه...  :  اینم کد  کلاس دیالوگ :

   static void ProgressDownloader() {
        final Dialog dialog = new Dialog(G.currentActivity);
        dialog.setContentView(R.layout.pr);

        final TextView txtDownload = (TextView) dialog.findViewById(R.id.txtDownload);
        final TextView totalSizes = (TextView) dialog.findViewById(R.id.totalSizes);
        final ProgressBar prgDownload = (ProgressBar) dialog.findViewById(R.id.prgDownload);
        dialog.show();
        OnProgressDownloadListener listener = new OnProgressDownloadListener() {  ==>  در این قسمت listener  زیرش خط چین داره و جایی صدا زده نشده 

            private String convertByteToMB(int byteLength) {
                float sizeInKB = (float) byteLength / 1024;
                float sizeInMB = (float) sizeInKB / 1024;

                return String.format("%.1fMB", sizeInMB);
            }


            @Override
            public void onProgressDownload(int percent, int downloadedSize, int fileSize) {
                prgDownload.setProgress(percent);

                String totalSize = convertByteToMB(downloadedSize) + "/" + convertByteToMB(fileSize);
                txtDownload.setText(percent + "% " + totalSize);
                totalSizes.setText(fileSize);

            }

        };

    }

  اینم ظاهر  بی ریخت و امتحانی  دیالوگ من برای تووضیح بیشتر  :))))

                            

 بعد ازین کار  اومدم توو متد مربوطه این کدها رو که در کلاس دیالوگ هس به این شکل صدا زدم

  final String filename = HelperString.getFileName(G.selectedMusic.file);

        DownloadRequest downloadRequest = new DownloadRequest()
                .downloadPath("http://192.168.1.105/Folkolor/" + G.selectedMusic.file)
                .filepath(G.DIR_MUSIC + "/" + filename)

                .listener(new OnDownloadCompleteListener() {

                    @Override
                    public void onDownloadComplete(String url, String localPath) {
                        File file = new File(localPath);
                        new File(G.DIR_MUSIC + "/" + filename).exists();

                    }

                })
                .progressListener(new OnProgressDownloadListener() {

                    @Override
                    public void onProgressDownload(int percent, int finalDownloadedSize, int totalSize) {
                        // TODO Auto-generated method stub
                        super.onProgressDownload(percent, finalDownloadedSize, totalSize);
                        Dialogs.ProgressDownloader();  =========================================>>   اینجا صدا زدم 

                    }

                })
                .download();

 با این که این کارهارو هم انجام دادم اما اررور داره ... نمیدنم چرا ؟؟ !!!!!  ممنون میشم اگه کمک کنید

0 0
لطفا کمک کنید (10 سال پیش)
0 0
(10 سال پیش)
پاسخ به سوال 
ba2ever  10 سال پیش
0 0

من اومدم این کارو کردم . این مشکلش چیه الان ؟؟

  static void ProgressDownloader() {
        View view = G.inflater.inflate(R.layout.pr, null, true);

        final Dialog dialog = new Dialog(G.currentActivity);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

        final ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.prgDownload);
        final TextView txtDownload = (TextView) view.findViewById(R.id.txtDownload);
        final OnProgressDownloadListener progressListener = new OnProgressDownloadListener() {

            private String convertByteToMB(int byteLength) {
                float sizeInKB = (float) byteLength / 1024;
                float sizeInMB = (float) sizeInKB / 1024;

                return String.format("%.1fMB", sizeInMB);
            }


            @Override
            public void onProgressDownload(final int percent, final int downloadedSize, final int fileSize) {

                G.HANDLER.post(new Runnable() {

                    @Override
                    public void run() {
                        progressBar.setProgress(percent);
                        txtDownload.setText(percent + "% " + convertByteToMB(downloadedSize) + "/" + convertByteToMB(fileSize));
                    }
                });
            }

        };
        final String filename = HelperString.getFileName(G.selectedMusic.file);

        DownloadRequest downloadRequest = new DownloadRequest()
                .downloadPath("http://192.168.1.105/Folkolor/" + G.selectedMusic.file)
                .filepath(G.DIR_MUSIC + "/" + filename)

                .listener(new OnDownloadCompleteListener() {

                    @Override
                    public void onDownloadComplete(String url, String localPath) {
                        File file = new File(localPath);
                        new File(G.DIR_MUSIC + "/" + filename).exists();

                    }

                })
                .progressListener(progressListener)
                .download();
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(30);

                        G.HANDLER.post(new Runnable() {

                            @Override
                            public void run() {
                                dialog.show();
                            }
                        });

                    }
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        thread.start();
    }
+1 0
دوست عزیز شما همش کل کدهاتو کپی کردی و پرسیدی مشکل این کدها چیه، خیلی احتمالش کمه که دوستان فقط با خوندن این کدها بتونن بگن مشکل از کجاست. اصن پیداکردن مشکل کار دوستان نیست، شما باید مشکل رو پیدا کنید، خطاهای لاگ کت رو قرار بدید، بعد بگید دوستان راهنمایی کنند. الان بهترین کار اینه که دیباگ کنید، ببینید هر متغیر در هر خط چه مقادیری داره، بعد که دقیق فهمیدید مشکل از کجاست، بگید مشکل چیه(با خطای لاگ کت) تا کمکتون کنیم. در حال حاضر من فقط میتونم بگم بهتره از AsyncTask استفاده کنید. (10 سال پیش)

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