خطا در دانلود فایل های حجیم
سلام
من در پروژه ای یک دانلودر دارم که فایل های حجیم رو دانلود میکنه ...
مشکل اینکه بعد از اینکه مقداری از فایل رو دانلود میکنه به catch بر میخوره از نوع IOException ...
پرینت خطا :
java.io.IOException: unexpected end of stream at libcore.net.http.FixedLengthInputStream.read(FixedLengthInputStream.java:48) at java.io.InputStream.read(InputStream.java:163) at ir.game.helper.Downloader$1.run(Downloader.java:191) at java.lang.Thread.run(Thread.java:838)
خطی که خطا توش هست :
while ((BufferedLen = InputStream.read(DownloadBuffer)) > 0) {
لطفا راهنمایی کنید .
ممنون
بهتره بعد از هر یک مگابایت فایل خروجی رو آزاد کنی تا سیستم عامل آندروید بزاره دانلودت رو کامل انجام بدی.
byte[] buffer = new byte[8192];
int readCount;
int bytesBuffered = 0;
while ((readCount = is.read(buffer)) > 0) {
os.write(buffer, 0, readCount);
bytesBuffered += readCount;
if (bytesBuffered > 1024 * 1024) { //flush after 1MB
bytesBuffered = 0;
os.flush();
}
}
os.flush();
os.close();
is.close();
امیر جان انگار مشکل شما حل نشده.
خودم تست نکردم ولی قبلا شنیده بودم برای ویدیو های حجم بالا باید حتما از دانلود منیجر خود اندروید استفاده بشه. از اونجایی که ویدیو با فایل فرقی نداره، گشتم و این تاپیک رو پیدا کردم.
لینک روش های مختلف دانلود فایل ، از اونجایی که این لینک خیلی کامل توضیح داده و روش های مختلف دانلود رو شامل میشه، میتونید همه رو تست کنید، ولی پیشنهاد میکنم اول روش سوم رو تست کنید.
(در لینک بالا، AsyncTask، دانلود از طریق سرویس، 2 کتابخانه برای دانلود و دانلود از طریق دانلود منیجر با نمونه کد قرار داده شده)
موفق باشید.
ممنون دوستان، لطف دارید.
فقط رسیدم بنویسمش، تمیز کردنش با شما. اگر میتونید، یک کلاس دانلودر با دانلود منیجر بنویسید که از AsyncTask هم استفاده کنه. (قابل پیاده سازیه و اصلا کار سختی نیست) کلاستون از قوانین DesignPatternBuilder تبعیت کنه و خیلی راحت بشه نوتیفیکیشن رو فعال یا غیر فعال، یک لیستنر برای زمانی که دانلود انجام میشه و زمانی که دانلود به اتمام میرسه، قابلیت دانلود چند فایل با هم و ... رو داشته باشه.
/**
* Created by Hajhosseini on 10/31/2015.
*/
private void downloadSomeFile(){
String url = "http://orig15.deviantart.net/4eb3/f/2014/004/8/0/__i_m_so_pathetic____no_background__by_liamwhite1-d70v94v.png";
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setDescription("Some descrition");
request.setTitle("Some title");
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION);
}
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "pony.png");
final DownloadManager manager = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
final long downloadId = manager.enqueue(request);
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(downloadId);
new Thread(new Runnable() {
@Override
public void run() {
boolean downloading = true;
while (downloading) {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downloadId);
Cursor cursor = manager.query(query);
cursor.moveToFirst();
int bytes_downloaded = cursor.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
downloading = false;
}
final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if(dl_progress == 100) {
Toast.makeText(getActivity(), "Complete", Toast.LENGTH_LONG).show();
return;
}
Log.i("LOG","percent = "+ dl_progress);
}
});
cursor.close();
}
}
}).start();
}
برای غیر فعال کردن نوتیفیکیشن هم باید فلگ زیر رو تغییر میدادید
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION);
حل شد:)
با کدی که جناب حاج حسینی گذاشتند به راحتی و بدون دردسر میشه فایلهای حجیمو دانلود کرد و حتی پروگرس کاستوم خودمونو ست کنیم ، نیازی هم به نوشتن دانلودر نیست.
بنده خودم تقریبا یه هفته نزدیک به 8 دانلودر مختلفو تست کردم ولی توی دانلود فایلهای متوسط و حجیم در مواقع گوناگون به catch میخورد.
اما با راهنمایی جناب حاج حسینی به ساده ترین شکل با خود دانلود منیجر آندروید تونستم کاملا کاستوم شده اونچیزی که میخوامو پیاده کنم.
اینه تفاوت یه حرفه ای :)))
تشکر ویژه از جناب حاج حسینی که به سرعت پیگیری کردند.
لطف داری امیر جان
از اونجایی که اصلا نمیتونم کثیف کد نوشتن رو تحمل کنم و خیلی فکرم رو نامنظم میکنه، دانلودر بالا رو یکم تمیز کردم، البته هنوز هم جا برای کامل تر شدن داره و من حتی وقت نکردم کامل تستش کنم. امیدوارم دوستان کمک کنند...
قابلیت ها:
-فعال یا غیر فعال کردن نوتیفیکیشن.
-ست کردن Title برای نوتیفیکیشن (اگر ست نکنید زمان باقی مانده از دانلود رو میزنه).
-ست کردن Description برای نوتیفیکیشن.
-ست کردن نام فایل خروجی(باید با پسوند باشد).
-ست کردن نوع فایل خروجی.
-OnDownloadCompleteListener
-OnDownloadProgressListener
توضیحات: چند پارامتر ورودی در کانستراکتور وجود دارد، دلیل وجود این پارامترها، الزام وجود آنهاست. (مثلا url حتما باید پر شده باشه و امکان خالی گذاشتنش نباید وجود داشته باشه)
سورس
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .