使用Picasso加载图像时,我面临outOfMemory异常。
我正在使用OkHttp创建Picasso Builder,并创建了Picasso Singleton类来缓存图像。

场景:
我有100多个要加载的图像供稿。我正在按组获取图像,每组都有25个图像URL,这些URL是我用毕加索设置的。我正在使用recyclerview,并且每当有新的图像集出现时,我都会调用adapter.notifyDataSetChanged()。我在进行改造以获得下一组并添加到现有列表并调用-adapter.notifyDataSetChanged()时,加载第二组和第三组的第一组-没有问题。对于第三个设置,当我调用adapter.NotifyDataSetChanged()应用程序崩溃时出现outOfMemoryException



当我加载全部3组75张图像时,我不会遇到任何问题。

码:
应用程序类-我将在其中构建毕加索。

 Picasso.Builder builder = new Picasso.Builder(this)
            .memoryCache(new LruCache(24000));
    builder.downloader(new OkHttpDownloader(this,Integer.MAX_VALUE));
    Picasso built = builder.build();
    built.setLoggingEnabled(true);


毕加索单例课程:

public class PicassoCache {

/**
 * Static Picasso Instance
 */
private static Picasso picassoInstance = null;

/**
 * PicassoCache Constructor
 *
 * @param context application Context
 */
private PicassoCache (Context context) {

    Downloader downloader   = new OkHttpDownloader(context, Integer.MAX_VALUE);
    Picasso.Builder builder = new Picasso.Builder(context);
    builder.downloader(downloader);

    picassoInstance = builder.build();
}

/**
 * Get Singleton Picasso Instance
 *
 * @param context application Context
 * @return Picasso instance
 */
public static Picasso getPicassoInstance (Context context) {

    if (picassoInstance == null) {

        new PicassoCache(context);
        return picassoInstance;
    }

    return picassoInstance;
}

}


使用Picasso设置/加载图像的代码。

  PicassoCache.getPicassoInstance(context).load(url).placeholder(R.mipmap.banner_placeholder).into(mView);


当数据集更改时,我在其中更新现有列表以加载的代码。

内部Retorfit OnSuccess消息:

    if (response.code() == 200) {

List<CampaignCard> newCampaigns = response.body().getCampaigns();


for (int i = 0; i < newCampaigns.size(); i++) {
    if (!campaignCards.contains(newCampaigns.get(i))) {
        campaignCards.add(newCampaigns.get(i));
    }
}

dashBoardAdapter.notifyDataSetChanged();

} else if (response.code() == Params.CODE_422) {
    Utils.ShowServiceErrorMessages(getActivity(), response);
} else if (response.code() == Params.CODE_401) {
    Utils.Logout(getActivity());
}


适配器类别:

public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardViewHolder> implements View.OnClickListener {


    private static final int VIEW_TYPE_CAMPAIGN = 1;
    private static final int VIEW_TYPE_FEED = 2;

    DashboardViewHolder holder;


    protected List list;
    protected int viewTypeLayout;
    Context context;
    int position;

    Dashboard.DashboardActionList actionList;
    Map<String, SourceContent> mPreviewLinkMapper;
    ViewGroup parent;

    //Picasso p;
    public DashboardAdapter(List list, int viewTypeLayout) {
        this.list = list;
        this.viewTypeLayout = viewTypeLayout;
    }

    public DashboardAdapter(List list, int viewTypeLayout, Context context, Map<String, SourceContent> mPreviewLinkMapper) {
        this.list = list;
        this.viewTypeLayout = viewTypeLayout;
        this.mPreviewLinkMapper = mPreviewLinkMapper;
    }

    @Override
    public DashboardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        context = parent.getContext();
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_feed, parent, false);
        return new DashboardViewHolder(view, 2);

    }

    @Override
    public void onBindViewHolder(DashboardViewHolder holder, final int position) {
        BindFeedData(holder, position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        return list.size();
    }





    @SuppressWarnings("unchecked")
    private void BindFeedData(DashboardViewHolder holder, int position) {
        List<Feed> feeds = (List<Feed>) list;
        if (holder.mBannerImage != null) {
            if (feeds.get(position).getCampaign().getParticipation().getType().toLowerCase().contains("video")) {

                holder.mPlayIcon.setVisibility(View.VISIBLE);
                String url = feeds.get(position).getCampaign().getParticipation().getThumbnail_url();
                Utils.LoadImages(context, url, holder.mBannerImage, false);

            } else if (feeds.get(position).getCampaign().getParticipation().getType().toLowerCase().contains("gif")) {

                holder.mPlayIcon.setVisibility(View.GONE);
                String url = feeds.get(position).getCampaign().getParticipation().getPost_file();
                Utils.loadGif(context, url, holder.mBannerImage);

            } else if (feeds.get(position).getCampaign().getParticipation().getType().toLowerCase().contains("link") ||
                    feeds.get(position).getCampaign().getParticipation().getType().toLowerCase().contains("youtube")) {

                holder.mPlayIcon.setVisibility(View.GONE);
                String slug = feeds.get(position).getCampaign().getSlug();
                List<String> images = mPreviewLinkMapper.get(slug).getImages();
                Utils.LoadImages(context, images.get(0), holder.mBannerImage, false);

            } else {
                holder.mPlayIcon.setVisibility(View.GONE);
                holder.mBannerImage.setVisibility(View.VISIBLE);
                String url = feeds.get(position).getCampaign().getParticipation().getPost_file();
                Utils.LoadImages(context, url, holder.mBannerImage, false);
            }
        }

        if (holder.mBrandLogo != null) {
            Utils.LoadImages(context, feeds.get(position).getInfluencer().getProfile_picture_url(), holder.mBrandLogo, true);
        }


        holder.mTitle.setText(feeds.get(position).getInfluencer().getName());
        holder.mSubTitle.setText(feeds.get(position).getCampaign().getName());
        holder.mTime.setText(feeds.get(position).getCampaign().getTimestamp());
        holder.mDescription.setText(feeds.get(position).getCampaign().getParticipation().getPost_content());
        holder.mEngagement.setText(feeds.get(position).getCampaign().getParticipation().getMetrics().getEngagements());
        holder.mImpresion.setText(feeds.get(position).getCampaign().getParticipation().getMetrics().getImpressions());
    }



    }


    public static class DashboardViewHolder extends RecyclerView.ViewHolder {

        ImageView mBannerImage, mFacebook, mTwitter, mInstagram, mPlayIcon, mHotIcon, mLocationIcon;
        CircularImageView mBrandLogo;
        CustomTextViewRegular mDescription, mTime, mOption1, mOption2, mOption3;
        CustomTextViewDemi mTitle, mSubTitle, mImpresion, mEngagement;
        LinearLayout mDetailsLayout;

        LinearLayout mOptionLayout1, mOptionLayout2, mOptionLayout3;
        public ViewGroup dropPreview;

        TableRow mTableOptions;

        public DashboardViewHolder(View v, int viewtype) {
            super(v);
            InitFeedViews(v);
          }




        private void InitFeedViews(View v) {
            mTitle = (CustomTextViewDemi) v.findViewById(R.id.adapterHeaderLayoutTitle);
            mSubTitle = (CustomTextViewDemi) v.findViewById(R.id.adapterHeaderLayoutSubTitle);
            mBrandLogo = (CircularImageView) v.findViewById(R.id.adapterHeaderLayoutLogo);
            mTime = (CustomTextViewRegular) v.findViewById(R.id.adapterHeaderLayoutTime);

            mBannerImage = (ImageView) v.findViewById(R.id.adapterFeedBannerImage);
            mPlayIcon = (ImageView) v.findViewById(R.id.adapterFeedPlayIocn);

            mImpresion = (CustomTextViewDemi) v.findViewById(R.id.adapterFeedImpressions);
            mEngagement = (CustomTextViewDemi) v.findViewById(R.id.adapterFeedEngagements);
            mDescription = (CustomTextViewRegular) v.findViewById(R.id.adapterFeedDescription);

            dropPreview = (LinearLayout) v.findViewById(R.id.drop_preview);
        }

    }

}

最佳答案

如果有毕加索库,您将面临很多“内存不足”的问题,我建议您使用Glide库。
我尝试了很多“内存不足”异常,但最后在使用滑行时效果很好。

关于android - 内存不足异常-对于使用Picasso加载图像时的adapter.notifiyDataSetChanged(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40989155/

10-11 22:17
查看更多