آموزش بارگذاری مستقیم تصویر از سرور و نمایش در imageView
سلام دوستان
در روشی که استاد در آموزش 4-16 بیان کردند تصاویر ابتدا باید از سرور دانلود شده و روی گوشی ذخیره میشدن تا بعد بشه اونها را داخل imageView نشون داد که این روش برای اپ هایی که تصاویر زیادی دارن باعث میشه رم طرف زود پر شه که در این صورت تنها چاره کار اینه که تصویر را مستقیم از سرور بگیری و درون imageView نشون بدی و تنها تصاویری که کاربر میخواد ذخیره کنه را با استفاده از لایبرری استاد دانلود کنی. برای نمایش مستقیم عکس از یک URL من از کد زیر استفاده میکنم :
ImageView imgThumb = (ImageView) view.findViewById(R.id.imgThumb);
try { URL url = new URL("http://.....Image Path....."); Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream()); imgThumb.setImageBitmap(image); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
حالا سوال اصلی اینجاست که اگه خواستی از این تصویر برای لیست ویو استفاده کنیم و کاربر با یک اسکرول یکدفعه درخواست گرفتن و نمایش 100تا تصویر را داد اینجوری حجم بالایی از درخواست و دانلود برای سرور فرستاده میشه که خوب این به نظر جالب نمیاد و ممکنه منابع را درگیر کنه و حتی برنامه فرس کلوز بشه حالا چطور میشه این کد را بهینه کرد؟
یه مثال خوب و بهینه به نظرم اپ نت برگ یا دیوار یا حتی همون کافه بازاره
ممنون از همه
من سعی میکنم یکم راهنمایی کنم تا کلا برنامه ی بهینه تر بنویسی !
در آموزش هایی که اسپیریت عزیز لینک داده بود (ویدئو های آموزشی گوگل) گفته بود 3 جا باید از ترد استفاده بشه
- ارتباط با اینترنت
- خواندن اطلاعات از بانک اطلاعاتی
- Decode کردن BitMap
وقتی این کاری که میخواید انجام بدید 2 مورد رو همزمان داره پس حتما باید از Thread ها استفاده بشه :)
ArrayList<Thread> threads = new ArrayList<Thread>();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
ImageView imgThumb = (ImageView) view.findViewById(R.id.imgThumb);
try {
URL url = new URL("http://.....Image Path.....");
Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
imgThumb.setImageBitmap(image);
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
});
threads.add(thread);
// May be 1000 Threads Add Here !
startDownloadQueue(threads);
تابع startDownloadQueue هم باید به شکلی نوشته بشه که از اولین Thread شروع کنه و در onDownloadFinished دوباره فراخوانی بشه ، برای اینکه موقعیت ایتمی که الان باید دانلود بشه رو هم داشته باشید کافیه یک فیلد به اسم index در سطج کلاس بسازید و در رویداد onDownloadComplete اون رو ++ کنید
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .