2016-12-06 85 views
2

我在使用Picasso加載圖像時面臨outOfMemory異常。 我使用OkHttp創建畢加索構建器並創建了Picasso Singleton類來緩存圖像。OutOfMemory異常 - 用於使用picasso加載圖像時的adapter.notifiyDataSetChanged()

場景: 我有100多個要加載的圖片訂閱源。我得到的圖像集,每集有25個圖像的網址,我正在與畢加索設置。我正在使用recyclerview和每當新的圖像集進來我打電話adapter.notifyDataSetChanged()。我正在加載第一組 - 沒有問題,第二組和第三組在進行改進時獲取下一組並添加到現有列表並調用 - adapter.notifyDataSetChanged()。對於第3集時,我打電話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; 
} 

} 

代碼在那裏我設置/加載圖像與畢加索。

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); 
     } 

    } 

} 
+0

使用recycleview和調整圖像,同時裝載.. –

+0

@sunilsunny我使用recyclerview和調整大小並沒有奏效。 – MobDev

+0

分享您的適配器代碼。大多數位圖會產生OOM。問題可能在那裏。 –

回答

1

你會面臨「內存不足」的問題,很多畢加索庫的情況下,我會建議你使用滑翔圖書館。 我有很多「內存不足」的例外嘗試所有,但最後當我用滑翔它運作良好。