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

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

Vahid  11 سال پیش  10 سال پیش
+2 0

سلام

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

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

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

ممنون

0 0
از دوستان کسی راه حلی برای این سئوال نداره ؟ (11 سال پیش)
0 0
دوستان بنده هم به این مشکل خوردم توی stack هم هرچقدر گشتم جواب درستی پیدا نشد حرف های ها یه کمکی بکنند (10 سال پیش)
 برای این سوال 6 پاسخ وجود دارد.
پاسخ به سوال 
پیام  10 سال پیش
+1 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();
0 0
ممنون دوست عزیز اما بازهم بی فایده بود catch کامل رو همین پایین میذارم دوستانی که راه حل دارند راهنمایی کنند ممنون (10 سال پیش)
0 0
حواسم نبود کش همونیه که دوستمون vahid گذاشتن (10 سال پیش)
پاسخ به سوال 
Hajhosseini  10 سال پیش
+5 0

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

پاسخ به سوال 
Hajhosseini  10 سال پیش
+5 0

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

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

ممنون دوستان، لطف دارید.
فقط رسیدم بنویسمش، تمیز کردنش با شما. اگر میتونید، یک کلاس دانلودر با دانلود منیجر بنویسید که از 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);
+1 0
مرسی آقای حاج حسینی عزیز :))) حتما امتحانش میکنم و نتیجه رو همینجا اعلام میکنم تشکر از پیگیریتون. در مورد نوتیفیکیشن همین فلگو ست کردم ولی جواب نداد که بعد متوجه شدم باید از دسترسی "android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" استفاده کنم و جواب داد. (10 سال پیش)
+1 0
من روی نوت 3 با اندروید 5 تست کردم مشکلی نداشت. ممنون از اطلاع رسانی. (10 سال پیش)
پاسخ به سوال 
amiryaser  10 سال پیش
+2 0

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

پاسخ به سوال 
Hajhosseini  10 سال پیش
+5 0

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


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