برای شروع، یک کلاس تعریف میکنیم که عملیات دانلود کردن فایل در آن انجام میشود. این کلاس یک متد اصلی دارد که کل عملیات دانلود فایل در آن انجام میشود. برای دانلود فایل، شما به یک شیء از کلاس URLConnection نیاز دارید. به سازنده این شیء یک شیء از کلاس URL میدهیم که نشان دهنده آدرس فایلی است که قرار است دانلود شود و دو شیء از کلاسهای InputStream و OutputStream. اولی بعد از باز شدن یک ارتباط با URLConnection توسط متد openstream کلاس URL مقداردهی میشود که نشاندهنده یک Stream از فایلی است که میخواهیم آن را دانلود کنیم. کلاس دومی یک OutputStream است که نشاندهنده محل ذخیرهسازی فایل روی حافظه دستگاه است.
حالا کاری که باید انجام دهیم این است که در هر مرحله یک بلاک از InputStream تعریف کنیم و ریختن آن در OutputStream است. برای اینکه مشخص کنیم در هر مرحله چقدر داده از فایل منبع خواندهایم، یک بلاک با طول ثابت ازbyte تعریف میکنیم و در هر مرحله به InputStream میگوییم این مقدار را از فایل منبع بخواند و در OutputStream آن را ذخیره کند، بعد این کار را تا زمانی انجام میدهیم که عمل خواندن از InputStream خروجی نداشته باشد. در این مرحله کار دانلود تمام شده و تمامی منابع باز را میبندیم و با یک پیغام به کاربر میگوییم فایل مورد نظر دانلود شده است.
اما این تمام ماجرا نیست؛ ما قرار است سرعت دانلود و مدت زمان باقیمانده و درصد دانلود فایل را به کاربر اطلاع دهیم.
برای محاسبه سرعت دانلود، از روش زیر استفاده میکنیم؛ قبل از اینکه عمل دانلود فایل آغاز شود زمان جاری سیستم را که به صورت میلیثانیه است، ذخیره میکنیم. پس از خواندن یک بلاک از InputStream زمان جاری سیستم را از زمانی که دانلود فایل آغاز شده است کم میکنیم و زمانی که طول کشیده از اول دانلود تا به حال را محاسبه میکنیم و یک متغیر از نوع int نیز تعریف میکنیم که هر بار مقدار دادهای را که از InputStream خوانده میشود در خود ذخیره میکند. این متغیر بر حسب byte بوده و قرار است سرعت را بر حسب کیلوبایت بر ثانیه به کاربر نمایش دهد برای این کار مقدار آن را بر 1024 تقسیم میکنیم، سپس زمانی را که بالا بر حسب میلیثانیه به دست آوردیم بر1000 تقسیم و حاصل این دو مقدار را بر هم تقسیم میکنیم. نتیجه میانگین سرعت دانلود ما از ابتدای شروع دانلود فایل تا به حال بوده است. اگر بخواهیم یک فرمول ثابت برای آن تعریف کنیم به صورت زیر مینویسیم، X مقدار بایتی است که از ابتدا تا به حال خوانده شده است و Y زمان سپری شده از ابتداست که بر حسب میلیثانیه بوده و فرمول به صورت زیر است:
speed = 1000/1024 * (x/y)
مقدار speed سرعت متوسط بر حسب کیلوبایت بر ثانیه است.
بسیار خب حالا میخواهیم درصد دانلود شدن فایل را نشان دهیم. برای این کار باید حجم اصلی فایل را محاسبه کنیم سپس با استفاده از مقدار حجمی که دانلود شده درصد دانلود فایل را به دست آوریم.
برای محاسبه حجم از متد getContentLength کلاس URLConnection را به دست میآوریم، سپس با استفاده ازفرمول زیر درصد باقیمانده از دانلود فایل را محاسبه میکنیم.
int percentage = (int)(total*100/lenghtOfFile();
مقدار total حجم فایلی است که تا به حال خوانده شده و lenghtOfFile حجم فایلی را که قرار است دانلود شود مشخص میکند.
حال میخواهیم زمان باقیمانده برای دانلود فایل را بر اساس سرعتی که به دست آوردیم محاسبه کنیم. برای این کار کافی است حجم کل فایل را از حجم خوانده شده کم و بر میزان سرعت دانلود تقسیم کنیم، تا میزان زمان باقیمانده بر حسب میلیثانیه به دست آید. به فرمول زیر دقت کنید.
double remindertime = (lenghtOfFile - total) / speed;
مقدار remindertime برابر زمان تقریبی باقیمانده برای دانلود فایل است؛ اما چرا تقریبی؟ به این دلیل که سرعت شبکه یک مقدار ثابت ندارد و هرلحظه تفاوت میکند، بنابراین نمیشود به طور دقیق یک مقدار مشخص برای سرعت و زمان باقیمانده را محاسبه کرد.
کد مطالبی را که توضیح داده شد میتوانید از لینک زیر دانلود کنید:
http://dotnetdeveloper.persiangig.com/Code%20Snippet/code.txt
در شماره بعدی برای نمایش مشخصات دانلود در Notification Bar بحث میکنیم.
امیربهاءالدین سبطالشیخ