Android OutOfMemory异常-用于加载picasso图像时适配器.notifiyDataSetChanged()的异常
在用毕加索加载图像时,我遇到了outOfMemory异常。 我正在使用OkHttp创建毕加索生成器,并创建了毕加索Singleton类来缓存图像 情景: 我有100多个图像饲料是要加载。我得到一组图像,每组有25个图像url,这是我和毕加索一起设置的。我正在使用recyclerview,每当有新的映像集出现时,我都会调用adapter.notifyDataSetChanged()。我正在加载第一组-无问题,第二组和第三组在进行改装以获得下一组并添加到现有列表并调用-adapter.notifyDataSetChanged()时。当我调用adapter.NotifyDataSetChanged()时,应用程序崩溃,outOfMemoryException 但是 当我加载所有3组75幅图像时,我不会遇到任何问题 代码: 应用程序类-我在那里创建毕加索。Android OutOfMemory异常-用于加载picasso图像时适配器.notifiyDataSetChanged()的异常,android,out-of-memory,picasso,Android,Out Of Memory,Picasso,在用毕加索加载图像时,我遇到了outOfMemory异常。 我正在使用OkHttp创建毕加索生成器,并创建了毕加索Singleton类来缓存图像 情景: 我有100多个图像饲料是要加载。我得到一组图像,每组有25个图像url,这是我和毕加索一起设置的。我正在使用recyclerview,每当有新的映像集出现时,我都会调用adapter.notifyDataSetChanged()。我正在加载第一组-无问题,第二组和第三组在进行改装以获得下一组并添加到现有列表并调用-adapter.notifyD
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);
当数据集发生更改时,更新要加载的现有列表的代码
内部重新安装成功消息:
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());
}
if(response.code()==200){
List newCampaigns=response.body().getCampaigns();
对于(int i=0;i
适配器类:
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);
}
}
}
公共类DashboardAdapter扩展了RecyclerView。适配器实现了View.OnClickListener{
私有静态最终内部视图类型活动=1;
私有静态最终整型视图\u类型\u提要=2;
仪表板支架;
受保护名单;
受保护的int VIEWTYPE布局;
语境;
内部位置;
Dashboard.DashboardActionList操作列表;
地图mPreviewLinkMapper;
视图组父对象;
//毕加索;
公用仪表板适配器(列表,int-viewTypeLayout){
this.list=列表;
this.viewTypeLayout=viewTypeLayout;
}
公用仪表板适配器(列表列表、int viewTypeLayout、上下文上下文、映射mPreviewLinkMapper){
this.list=列表;
this.viewTypeLayout=viewTypeLayout;
this.mPreviewLinkMapper=mPreviewLinkMapper;
}
@凌驾
公用仪表板ViewHolder onCreateViewHolder(视图组父级,int-viewType){
context=parent.getContext();
View=LayoutInflater.from(parent.getContext()).flate(R.layout.adapter_feed,parent,false);
返回新的仪表板视图保持架(视图,2);
}
@凌驾
BindViewHolder上的公共无效(仪表板ViewHolder,最终整型位置){
BindFeedData(支架、位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
public int getItemCount(){
返回list.size();
}
@抑制警告(“未选中”)
专用void BindFeedData(仪表板视图保持架,内部位置){
列表提要=(列表)列表;
if(holder.mBannerImage!=null){
if(feed.get(position.getCampaign().getParticipation().getType().toLowerCase().contains(“视频”)){
holder.mPlayIcon.setVisibility(View.VISIBLE);
字符串url=feeds.get(position.getCampaign().getParticipation().getThumbnail_url();
加载图像(上下文、url、holder.mBannerImage、false);
}else if(feeds.get(position.getCampaign().getParticipation().getType().toLowerCase().contains(“gif”)){
holder.mPlayIcon.setVisibility(View.GONE);
字符串url=feeds.get(position.getCampaign().getParticipation().getPost_file();
Utils.loadGif(上下文、url、holder.mBannerImage);
}else if(feed.get(position.getCampaign().getParticipation().getType().toLowerCase().contains)(“链接”)||
feeds.get(position.getCampaign().getParticipation().getType().toLowerCase().contains(“youtube”)){
holder.mPlayIcon.setVisibility(View.GONE);
字符串slug=feeds.get(位置).getCampaign().getSlug();
List images=mPreviewLinkMapper.get(slug.getImages();
Utils.LoadImages(上下文,images.get(0),holder.mBannerImage,false);
}否则{
holder.mPlayIcon.setVisibility(View.GONE);
holder.mBannerImage.setVisibility(视图.可见);
字符串url=feeds.get(position.getCampaign().getParticipation().getPost_file();
加载图像(上下文、url、holder.mBannerImage、false);
}
}
if(holder.mBrandLogo!=null){
Utils.LoadImages(context,feed.get(position).getInfluencer().getProfile\u picture\u 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(feed.get(position.getCampaign().getParticipation().getPost_content());
holder.mEngagement.setText(feed.get(position.getCampaign().getParticipation().getMetrics().getEngagements());
holder.mImpresion.setText(feeds.get(position.getCampaign().getParticipation().getMetrics().getImpressions());
}
}
公共静态类DashboardViewHolder扩展了RecyclerView.ViewHolder{
ImageView mBannerImage、mFacebook、mTwitter、mInstagram、mPlayIcon、mHotIcon、mLocationIcon;
CircularImageView-Embrandlogo;
CustomTextViewRegular MDDescription、mTime、mOption1、mOption2、mOption3;
CustomTextViewDemi mTitle