Picasso: تختفي الصور التي تم تنزيلها بالفعل أثناء التمرير لأعلى في عرض القائمة ، ويتم التحميل ببطء

تم إنشاؤها على ١٣ يناير ٢٠١٥  ·  6تعليقات  ·  مصدر: square/picasso

مرحبا جميعا،

يقوم عرض القائمة الخاص بي بتحميل صور بيكاسو ببطء. غالبًا ما أنتظر تنزيل صورة واحدة ، والتمرير قليلاً ، وانتظر حتى يتم تنزيل الصورة التالية في عرض القائمة ، فهي لا تعمل مسبقًا.

تختفي الصور التي تم تنزيلها أيضًا عند التمرير احتياطيًا. يبدو الأمر كما لو أن بيكاسو يقوم فقط بتحميل 4-5 صور في كل مرة واستبدال الصور التي تم تحميلها بالفعل لإفساح المجال. إليك (http://i.imgur.com/SvzGWLI.png) ما تبدو عليه ذاكرتي الآن أثناء التمرير لأعلى ولأسفل وانتظر تحميل الصور.

public class MainActivity extends Activity {
    private List<Post> myPosts = new ArrayList<Post>();
    protected String[] mBlogPostTitles;
    public static final String TAG = MainActivity.class.getSimpleName();

    ...

    private void populateListView() {
        Activity activity = MainActivity.this;

        ArrayAdapter<Post> adapter = new MyListAdapter();
        ListView list = (ListView) findViewById(R.id.postsListView);
        list.setAdapter(adapter);
        list.setOnScrollListener(new SampleScrollListener(activity));
    }

    private class MyListAdapter extends ArrayAdapter<Post>{
        public MyListAdapter() {
            super(MainActivity.this, R.layout.item_view, myPosts);
        }

        <strong i="8">@Override</strong>
        public int getViewTypeCount() {
            return 2;
        }

        <strong i="9">@Override</strong>
        public int getItemViewType(int position) {
            String imageURL = myPosts.get(position).getImage();
            if(imageURL == null || imageURL.isEmpty()){
                return 1; // text based
            }else{
                return 0; // image based
            }
        }

        <strong i="10">@Override</strong>
        public View getView(int position, View convertView, ViewGroup parent) {

            PostViewHolder holder;

            int type = getItemViewType(position);

            View itemView = convertView;

            // make sure we have a view to work with
            if (itemView == null) {
                holder = new PostViewHolder();
                if(type == 1) {
                    itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false);
                }else {
                    itemView = getLayoutInflater().inflate(R.layout.image_post_view, parent, false);
                    holder.image = (ImageView) itemView.findViewById(R.id.item_image);
                }
                holder.user = (TextView) itemView.findViewById(R.id.item_txtUser);
                holder.time = (TextView) itemView.findViewById(R.id.item_txtTime);
                holder.post = (TextView) itemView.findViewById(R.id.item_txtPost);
                holder.likes = (TextView) itemView.findViewById(R.id.item_txtLikes);

                itemView.setTag(holder);
            } else {
                holder = (PostViewHolder) itemView.getTag();
            }

            //find the post to work with
            Post currentPost = myPosts.get(position);

            if(type != 1) {
                Context context = itemView.getContext();
                String imageURL = currentPost.getImage();

                Picasso.with(context).setIndicatorsEnabled(true);
                //Picasso.with(context).setLoggingEnabled(true);
                Picasso.with(context)
                        .load(imageURL)
                        .tag(context)
                        .placeholder(R.drawable.kanye8080s)
                        //.skipMemoryCache()
                        .error(R.drawable.stadiumarcadium)
                        .fit()
                        .into(holder.image);
            }
            //Username
            holder.user.setText(currentPost.getUser());

            //Time of post
            holder.time.setText("" + currentPost.getTime());

            //The actual post
            holder.post.setText(currentPost.getPost());

            //Likes for the post
            holder.likes.setText("" + currentPost.getLikes());

            return itemView;
        }
    }
    public class SampleScrollListener implements AbsListView.OnScrollListener {
        private final Context context;

        public SampleScrollListener(Context context) {
            this.context = context;
        }

        <strong i="11">@Override</strong>
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            final Picasso picasso = Picasso.with(context);
            if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
                picasso.resumeTag(context);
            } else {
                picasso.pauseTag(context);
            }
        }

        <strong i="12">@Override</strong>
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                             int totalItemCount) {
            // Do nothing.
        }
    }


    ...
} 

لقد قمت بالفعل بنشر هذا القلق على SO (http://stackoverflow.com/questions/27771646/picasso-keeps-reloading-images- while-scrolling-upwards-in-listview-loads-s ببطء) ولكن لم أتمكن من إيجاد حل . كنت أتساءل إذا كنتم ، كملاذ أخير ، يمكن أن تساعدوني في اكتشاف ذلك؟ أنا أستخدم بالفعل استدعاء fit () ، لذلك لا أعتقد أنها مشكلة تتعلق بتغيير الحجم. أي مساعدة سيكون موضع تقدير كبير، وذلك بفضل!

التعليق الأكثر فائدة

rv.getRecycledViewPool().setMaxRecycledViews(0, 0);

باستخدام هذا حل مشكلتي

ال 6 كومينتر

هل الصور النقطية المصدر أكبر من أن يتم تنزيلها؟ اتصال الشبكة بطيء؟

هل جربت مكتبة أخرى لتحميل الصور؟ إذا قمت بذلك وعملت بشكل رائع ، فيرجى إبلاغي بذلك ويمكنني إلقاء نظرة. لدي شعور بأن هذا ليس خطأ بيكاسوس.

الصق عنوان URL الذي تستخدمه أو مجموعة منهم وسأضعهم في نموذج التطبيق.

لدي نفس المشكلة على الهواتف الذكية الأقل قوة. أنا أستخدم نمط إعادة التدوير للقائمة وبالتأكيد كان لدي أداء ذاكرة تخزين مؤقت أفضل مع مكتبة الطائرة: https://github.com/mcxiaoke/android-volley

rv.getRecycledViewPool().setMaxRecycledViews(0, 0);

باستخدام هذا حل مشكلتي

يتم إعادة تحميل الصور في إعادة التدوير حتى الطائرة باستخدام فئة LruCache؟

@ raj9686 هل ستخبرني من فضلك ، أين أستخدم هذا الخط ؟؟

فقط استخدم Glide ، لقد حلت مشكلتي ومن السهل تغييرها.

https://guides.codepath.com/android/Displaying-Images-with-the-Glide-v3-Library

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات