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

خطا در دانلود فایل های حجیم

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

سلام

من در پروژه ای یک دانلودر دارم که فایل های حجیم رو دانلود میکنه ...

مشکل اینکه بعد از اینکه مقداری از فایل رو دانلود میکنه به 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) {

لطفا راهنمایی کنید .

ممنون

نظرات

Vahid 11 سال پیش
از دوستان کسی راه حلی برای این سئوال نداره ؟
amiryaser 10 سال پیش
دوستان بنده هم به این مشکل خوردم توی stack هم هرچقدر گشتم جواب درستی پیدا نشد حرف های ها یه کمکی بکنند

پاسخ‌ها 6

پیام 10 سال پیش

بهتره بعد از هر یک مگابایت فایل خروجی رو آزاد کنی تا سیستم عامل آندروید بزاره دانلودت رو کامل انجام بدی.

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

نظرات

amiryaser 10 سال پیش
ممنون دوست عزیز اما بازهم بی فایده بود catch کامل رو همین پایین میذارم دوستانی که راه حل دارند راهنمایی کنند ممنون
amiryaser 10 سال پیش
حواسم نبود کش همونیه که دوستمون vahid گذاشتن
Hajhosseini 10 سال پیش

چند تا دلیل میتونه داشته باشه
1: باید از AsyncTask استفاده کنید.
2: ممکنه TimeOut بگیرید که میتونید خیلی راحت زمانش رو زیاد کنید.
این 3 تا لینک جواب سوالتون رو به طور کامل و با سورس پاسخ دادن.
لینک لینک لینک
اگر مشکل حل نشد سورس دانلودرتون رو درج کنید راهنماییتون کنیم.
موفق باشید

نظرات

Hajhosseini 10 سال پیش

امیر جان انگار مشکل شما حل نشده.
خودم تست نکردم ولی قبلا شنیده بودم برای ویدیو های حجم بالا باید حتما از دانلود منیجر خود اندروید استفاده بشه. از اونجایی که ویدیو با فایل فرقی نداره، گشتم و این تاپیک رو پیدا کردم.
لینک روش های مختلف دانلود فایل ، از اونجایی که این لینک خیلی کامل توضیح داده و روش های مختلف دانلود رو شامل میشه، میتونید همه رو تست کنید، ولی پیشنهاد میکنم اول روش سوم رو تست کنید.
(در لینک بالا، AsyncTask، دانلود از طریق سرویس، 2 کتابخانه برای دانلود و دانلود از طریق دانلود منیجر با نمونه کد قرار داده شده)
موفق باشید.

نظرات

حمید زمانی 10 سال پیش
آقای حاج حسینی جای تحسین داره که جواب هایی که میدین خیلی کامل و واضحه و هیچ نکته مبهم یا کاستی درش مشاهده نمیشه.
amiryaser 10 سال پیش
از زحمتی که کشیدید بسیار ممنونم جناب حاج حسینی همین روش asyncTask را قبلا تست کردم جواب نداد و یکی از کتابخانه ها رو هم همینطور... همینطور که گفته بودید روش آخر بسیار ساده و راحت است و بدون مشکل هم جواب میدهد اما مشکلی که دارد : 1- پس از پایان دانلود نوتیفیکیشن بار نمیخواهم فایل دانلود شده را نمایش دهد 2- در هنگام نمایش نوتیفیکیشن بار _یا به جای آن_ میخواهم پروگرس بار کاستوم خودم نمایش داده شود که اگر این دو مشکل نبود دیگه سمت اونهمه دردسر نمیرفتم :)))) اگه راهی هست روی همین دانلود منیجر آندروید اون 2 مشکلو حل کرد راهنمایی بفرمایید باز هم ممنون.
amiryaser 10 سال پیش
از زحمتی که کشیدید بسیار ممنونم جناب حاج حسینی همین روش asyncTask را قبلا تست کردم جواب نداد و یکی از کتابخانه ها رو هم همینطور... همینطور که گفته بودید روش آخر بسیار ساده و راحت است و بدون مشکل هم جواب میدهد اما مشکلی که دارد : 1- پس از پایان دانلود نوتیفیکیشن بار نمیخواهم فایل دانلود شده را نمایش دهد 2- در هنگام نمایش نوتیفیکیشن بار _یا به جای آن_ میخواهم پروگرس بار کاستوم خودم نمایش داده شود که اگر این دو مشکل نبود دیگه سمت اونهمه دردسر نمیرفتم :)))) اگه راهی هست روی همین دانلود منیجر آندروید اون 2 مشکلو حل کرد راهنمایی بفرمایید باز هم ممنون.
Hajhosseini 10 سال پیش

ممنون دوستان، لطف دارید.
فقط رسیدم بنویسمش، تمیز کردنش با شما. اگر میتونید، یک کلاس دانلودر با دانلود منیجر بنویسید که از 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);

نظرات

amiryaser 10 سال پیش
مرسی آقای حاج حسینی عزیز :))) حتما امتحانش میکنم و نتیجه رو همینجا اعلام میکنم تشکر از پیگیریتون. در مورد نوتیفیکیشن همین فلگو ست کردم ولی جواب نداد که بعد متوجه شدم باید از دسترسی "android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" استفاده کنم و جواب داد.
Hajhosseini 10 سال پیش
من روی نوت 3 با اندروید 5 تست کردم مشکلی نداشت. ممنون از اطلاع رسانی.
amiryaser 10 سال پیش

حل شد:)
با کدی که جناب حاج حسینی گذاشتند به راحتی و بدون دردسر میشه فایلهای حجیمو دانلود کرد و حتی پروگرس کاستوم خودمونو ست کنیم ، نیازی هم به نوشتن دانلودر نیست.
بنده خودم تقریبا یه هفته نزدیک به 8 دانلودر مختلفو تست کردم ولی توی دانلود فایلهای متوسط و حجیم در مواقع گوناگون به  catch  میخورد.
اما با راهنمایی جناب حاج حسینی به ساده ترین شکل با خود دانلود منیجر آندروید تونستم کاملا کاستوم شده اونچیزی که میخوامو پیاده کنم.
اینه تفاوت یه حرفه ای :)))
تشکر ویژه از جناب حاج حسینی که به سرعت پیگیری کردند.

نظرات

Hajhosseini 10 سال پیش

لطف داری امیر جان
از اونجایی که اصلا نمیتونم کثیف کد نوشتن رو تحمل کنم و خیلی فکرم رو نامنظم میکنه، دانلودر بالا رو یکم تمیز کردم، البته هنوز هم جا برای کامل تر شدن داره و من حتی وقت نکردم کامل تستش کنم. امیدوارم دوستان کمک کنند...
قابلیت ها:
-فعال یا غیر فعال کردن نوتیفیکیشن.
-ست کردن Title برای نوتیفیکیشن (اگر ست نکنید زمان باقی مانده از دانلود رو میزنه).
-ست کردن Description برای نوتیفیکیشن.
-ست کردن نام فایل خروجی(باید با پسوند باشد).
-ست کردن نوع فایل خروجی. 
-OnDownloadCompleteListener
-OnDownloadProgressListener
توضیحات: چند پارامتر ورودی در کانستراکتور وجود دارد، دلیل وجود این پارامترها، الزام وجود آنهاست. (مثلا url حتما باید پر شده باشه و امکان خالی گذاشتنش نباید وجود داشته باشه)
سورس

نظرات


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