PDA

View Full Version : مشکل با اسکرول سریع در recyclerview در هنگام استفاده از کتابخانه های لود تصویر



hamedg1366
سه شنبه 09 شهریور 1395, 23:50 عصر
با سلام و خسته نباشید خدمت همه عزیزان

وقتی اسکرول recyclerview رو میدم به پایین 20تای اولش رو سریع میره پایین ولی بقیه اش که میخواد رد کنه دچار هنگ کردن میشه با تیک رد میکنه و وقتی به اخر میرسه و میخوایم بیایم بالا برنامه کرش میکنه ؛ مشکل بنظر میاد از کتابخانه Universal Image Downloader هستش که مموری رو پر میکنه و کرش میکنه ، در ضمن اینم اضافه کنم که در بعضی مواقع تصاویر مربوط به آیتم های دیگه روی آیتم های دیگه ای قرار میگیره تا وقتی که لود تصوی رآیتم مورد نظر تکمیل بشه.

لینک به ایستک 1 (http://stackoverflow.com/questions/30236574/android-how-to-stop-images-reloading-in-recyclerview-when-scrolling), لینک به استک 2 (http://stackoverflow.com/questions/13855413/out-of-memory-error-using-universal-image-loader-and-images-getting-refreshed)
این آموزش رو دیدم
(http://www.101apps.co.za/index.php/articles/gridview-tutorial-using-the-universal-image-loader-library.html)

متاسفانه جوابگو نبودن ، از سایت آنکوکودر این لینک رو پیدا کردم (http://answers.uncox.com/android/question/8086/%DA%A9%DB%8C%D8%A7-%D8%A8%D8%A7-recyclerView-%DA%A9%D8%A7%D8%B1-%DA%A9%D8%B1%D8%AF%D9%86) که متاسفانه بنده اون جا vip نیستم و نمیتونم پاسخ ها رو ببینم ، لطفا اگه کسی اینجا عضو هستش راه حل رو اینجا هم بذاره و با به هر نحو کمک کنه از صبح ا این وقت شب وقتمو گرفته متاسفانه.




با تشکر از همه عزیزان




کدهای مربوطه :

قسمت تعریف کتابخونه

public static void setupUniversalImageLoader(Context context) {
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.mipmap.ic_launcher)
//.resetViewBeforeLoading(true) //
//.delayBeforeLoading(100) //
.cacheInMemory(true)
.cacheOnDisk(true)
.resetViewBeforeLoading(true)
.bitmapConfig(Bitmap.Config.RGB_565)
//.showImageOnLoading(R.mipmap.ic_launcher)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
//.defaultDisplayImageOptions(defaultOptions)
.threadPriority(3/*Thread.NORM_PRIORITY - 2*/)
.denyCacheImageMultipleSizesInMemory()
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
.diskCacheSize(50 * 1024 * 1024) // 50 Mb
.tasksProcessingOrder(QueueProcessingType.LIFO)
.build();
com.nostra13.universalimageloader.core.ImageLoader .getInstance().init(
config);
}



قسمت مربوط به آداپتور

try {
imag_link = imag_link.replaceAll(" ", "%20");
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(imag_link, holder.img_l1/*,defaultOptions*/);

Bitmap bmp = imageLoader.loadImageSync(imag_link); //load image darone bitmap
int h_bmp = bmp.getHeight(); //bedast avordane tole tasvir load shode
int w_bmp = bmp.getWidth(); //bedast avordane arze tasvir load shode

ViewGroup.LayoutParams params1 = holder.img_l1.getLayoutParams();
params1.height = (h_bmp * (w_bmp / 2) / w_bmp) * 4 / 3;
//ertef * arze feli / arze vagheye //jelogery az keshidane tasvir//
params1.width = w_bmp / 2;

holder.img_l1.setLayoutParams(params1);

imageLoader.displayImage(imag_link, holder.img_l1/*,defaultOptions*/);

} catch (Exception e) {

}

tux-world
چهارشنبه 10 شهریور 1395, 09:30 صبح
خوب خطا چی میده؟ مشکل از کتابخونه تنها نمیتونه باشه. شاید سایز عکسهایی که دارید لود میکنید بزرگ هستن و باید اونا روکوچیک کنید اگه روش کلیک کرد عکس با اندازه واقعی رو نشون بده. شما نمیتونی بیشتر چند مگ کوچک برای اون کارا از اندروید درخواست بدی. اندروید برنامه رو kill میکنه. اجازه هم نمیده.

peymanf11
چهارشنبه 10 شهریور 1395, 16:22 عصر
دوست عزیز همه جا رو جستجو کردین غیر از اونجایی که باید اول کار میرفتین

لینک (https://github.com/nostra13/Android-Universal-Image-Loader/wiki/Useful-Info)


جواب شما :


To avoid list (grid, ...) scrolling lags you can use PauseOnScrollListener:



boolean pauseOnScroll = false; // or true
boolean pauseOnFling = true; // or false
PauseOnScrollListener listener = new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling);
listView.setOnScrollListener(listener);

spiderman200700
چهارشنبه 10 شهریور 1395, 19:55 عصر
مشکل از این خطه:
Bitmap bmp = imageLoader.loadImageSync(imag_link); //load image darone bitmap

hamedg1366
چهارشنبه 10 شهریور 1395, 22:32 عصر
مشکل از این خطه:
Bitmap bmp = imageLoader.loadImageSync(imag_link); //load image darone bitmap


دوست عزیز این کار رو برای این انجام میدم که بتونم بر اساس اندازه تصویر طول و عرض نمایش رو تنظیم کنم ، راه حل دیگه ای برای این کار وجود داره ؟؟ ممنون میشم اشاره ای نمایید

spiderman200700
پنج شنبه 11 شهریور 1395, 15:45 عصر
دوست عزیز این کار رو برای این انجام میدم که بتونم بر اساس اندازه تصویر طول و عرض نمایش رو تنظیم کنم ، راه حل دیگه ای برای این کار وجود داره ؟؟ ممنون میشم اشاره ای نمایید

فکر میکنم اینجوری بنویسی مشکل حل میشه
imag_link = imag_link.replaceAll(" ", "%20");
ImageLoader.getInstance().loadImage(imag_link, new ImageLoadingListener() {

@Override
public void onLoadingStarted(String arg0, View arg1) {}

@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {}

@Override
public void onLoadingComplete(String arg0, View view, Bitmap bmp) {
int h_bmp = bmp.getHeight(); // bedast avordane tole tasvir load
// shode
int w_bmp = bmp.getWidth(); // bedast avordane arze tasvir load
// shode

ViewGroup.LayoutParams params1 = holder.img_l1
.getLayoutParams();
params1.height = (h_bmp * (w_bmp / 2) / w_bmp) * 4 / 3;
// ertef * arze feli / arze vagheye //jelogery az keshidane
// tasvir//
params1.width = w_bmp / 2;

holder.img_l1.setLayoutParams(params1);

imageLoader.displayImage(imag_link, holder.img_l1/*
* ,defaultOptions
*/);
}

@Override
public void onLoadingCancelled(String arg0, View arg1) {}
});