Android 随着线程加载图像导致OOM,堆增加

Android 随着线程加载图像导致OOM,堆增加,android,Android,我在这里面临一个真正的问题,这里我有一个列表视图,有过滤的部分和图像,没有图像,我的堆在5mb上是稳定的,但是只有3个图像,它提高到了27MB!所以我决定用一种威胁来这么做: @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { holder = new ViewHolder();

我在这里面临一个真正的问题,这里我有一个列表视图,有过滤的部分和图像,没有图像,我的堆在5mb上是稳定的,但是只有3个图像,它提高到了27MB!所以我决定用一种威胁来这么做:

  @Override
public View getView(final int position, View convertView, ViewGroup parent) {




     if (convertView == null) {
        holder = new ViewHolder();
        int type = getItemViewType(position);

        switch (type) {
        case TYPE_ITEM:
            convertView = mLayoutInflater.inflate(R.layout.row_view, 
 null);
             holder.imageview  = 
 (ImageView)convertView.findViewById(R.id.imageView3);

            Thread t= new Thread(new Runnable() {
                  @Override
                  public void run() {

             String name=mListItems.get(position).toString();
             String namer[] = name.split("\\@");
             String imagenamer=namer[0];

        //   String imagenamer= mListItems.get(position).toString();
             Uri uri1=Uri.parse("storage/sdcard/LifeMatePrivate
 /ProfileImage/ProfileImage,imagechange_1,"+imagenamer+".jpg");
             Uri uri2=Uri.parse("storage/sdcard/LifeMatePrivate
/ProfileImage/Default.jpg");
             File file = new File("storage/sdcard/LifeMatePrivate
/ProfileImage/ProfileImage,imagechange_1,"+imagenamer+".jpg");
         if (file.exists()){
             System.out.println("exists");
             holder.imageview.setImageURI(uri1);
        }else{
            holder.imageview.setImageURI(uri2);
            System.out.println("storage/sdcard/LifeMatePrivate
 /ProfileImage/ProfileImage,imagechange_1,"+imagenamer+".jpg"+"didnt exist"); 
        }}
        });
             t.start();     

             break;
        case TYPE_SECTION:
            convertView = 
 mLayoutInflater.inflate(R.layout.section_row_view, null);
            break;
        }
        holder.textView = (TextView)   
 convertView.findViewById(R.id.row_title);
        convertView.setTag(holder);


    } else {
        holder = (ViewHolder) convertView.getTag();
    }



    holder.textView.setText(mListItems.get(position).toString());

    return convertView;
}
但现在,当我运行应用程序时,我的内存直接出现异常,这意味着情况变得更糟!!这是给男人的吗?如何解决我的记忆问题

使用毕加索:(我的方法行吗?)

Context-mContext;
公共PinnedHeaderAdapter(上下文,ArrayList
listItems,ArrayList listSectionPos){
this.mContext=上下文;
this.mListItems=列表项;
this.mListSectionPos=listSectionPos;
MLAyoutFlater=(LayoutFlater)
mContext.getSystemService(Context.LAYOUT\u充气机\u服务);
}
@凌驾
public int getCount(){
返回mListItems.size();
}
@凌驾
公共布尔值areAllItemsEnabled(){
返回false;
}
@凌驾
公共布尔值isEnabled(整型位置){
return!mListSectionPos.contains(位置);
}
@凌驾
public int getViewTypeCount(){
返回类型\最大\计数;
}
@凌驾
public int getItemViewType(int位置){
返回mListSectionPos.contains(position)?TYPE_段:TYPE_项;
}
@凌驾
公共对象getItem(int位置){
返回mListItems.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回mListItems.get(position.hashCode();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null){
holder=新的ViewHolder();
int type=getItemViewType(位置);
开关(类型){
案例类型\u项目:
convertView=MLAYOUTINGER.充气(右布局行视图,
无效);
holder.imageview=
(ImageView)convertView.findViewById(R.id.imageView3);
String name=mListItems.get(position.toString();
字符串名称[]=name.split(“\\@”);
字符串imagenamer=namer[0];
//字符串imagenamer=mListItems.get(position.toString();
File File=新文件(“存储/SD卡/LifeMatePrivate
/ProfileImage/ProfileImage,imagechange_1,“+imagenamer+”.jpg”);
if(file.exists()){
Uri uri1=Uri.parse(“存储/sdcard/LifeMatePrivate
/ProfileImage/ProfileImage,imagechange_1,“+imagenamer+”.jpg”);
System.out.println(“存在”);
//holder.imageview.setImageURI(uri1);
毕加索(McContext)
.负载(uri1)
.调整大小(50,50)
.centerCrop()
.插入(支架.图像视图);
}否则{
Uri uri2=Uri.parse(“存储/sdcard/LifeMatePrivate
/ProfileImage/Default.jpg”);
//holder.imageview.setImageURI(uri2);
System.out.println(“存储/SD卡/LifeMatePrivate
/ProfileImage/ProfileImage,imagechange_1,“+imagenamer+”.jpg“+”不存在);
毕加索(McContext)
.负载(uri2)
.调整大小(70,70)
.centerCrop()
.插入(支架.图像视图);
}
打破
案例类型_部分:
convertView=
MLAYOUTINGER.充气(右布局剖面视图,空);
打破
}
holder.textView=(textView)
convertView.findViewById(R.id.row_title);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.textView.setText(mListItems.get(position.toString());
返回视图;
}

square.github.io/picasso使用此库在适配器中显示图像。此库将解决您的问题。

使用此库在适配器中显示图像。这个库可以解决你的问题。如果没有的话,我真的很感谢你。我使用了它,但没有显示图像,o上传了几乎完整的代码。你能发布新代码吗?啊,找到了,使用了错误的方法
 Context mContext;

public PinnedHeaderAdapter(Context context, ArrayList<String> 
 listItems,ArrayList<Integer> listSectionPos) {
    this.mContext = context;
    this.mListItems = listItems;
    this.mListSectionPos = listSectionPos;

    mLayoutInflater = (LayoutInflater) 
 mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
    return mListItems.size();
}

@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position) {
    return !mListSectionPos.contains(position);
}

@Override
public int getViewTypeCount() {
    return TYPE_MAX_COUNT;
}

@Override
public int getItemViewType(int position) {
    return mListSectionPos.contains(position) ? TYPE_SECTION : TYPE_ITEM;
}

@Override
public Object getItem(int position) {
    return mListItems.get(position);
}

@Override
public long getItemId(int position) {
    return mListItems.get(position).hashCode();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;



     if (convertView == null) {
        holder = new ViewHolder();
        int type = getItemViewType(position);

        switch (type) {
        case TYPE_ITEM:
            convertView = mLayoutInflater.inflate(R.layout.row_view, 
  null);
             holder.imageview  = 
 (ImageView)convertView.findViewById(R.id.imageView3);

              String name=mListItems.get(position).toString();
             String namer[] = name.split("\\@");
             String imagenamer=namer[0];

        //   String imagenamer= mListItems.get(position).toString();


             File file = new File("storage/sdcard/LifeMatePrivate
 /ProfileImage/ProfileImage,imagechange_1,"+imagenamer+".jpg");
         if (file.exists()){

             Uri uri1=Uri.parse("storage/sdcard/LifeMatePrivate
 /ProfileImage/ProfileImage,imagechange_1,"+imagenamer+".jpg");
             System.out.println("exists");
           //  holder.imageview.setImageURI(uri1);

             Picasso.with(mContext)
              .load(uri1)
              .resize(50, 50)
              .centerCrop()
              .into(holder.imageview);



         }else{

            Uri uri2=Uri.parse("storage/sdcard/LifeMatePrivate
 /ProfileImage/Default.jpg");
        //  holder.imageview.setImageURI(uri2);
            System.out.println("storage/sdcard/LifeMatePrivate
 /ProfileImage/ProfileImage,imagechange_1,"+imagenamer+".jpg"+"didnt exist"); 

            Picasso.with(mContext)
              .load(uri2)
              .resize(70, 70)
              .centerCrop()
              .into(holder.imageview);
         }

             break;
        case TYPE_SECTION:
            convertView = 
 mLayoutInflater.inflate(R.layout.section_row_view, null);
            break;
        }
        holder.textView = (TextView)  
 convertView.findViewById(R.id.row_title);
        convertView.setTag(holder);


    } else {
        holder = (ViewHolder) convertView.getTag();
    }



    holder.textView.setText(mListItems.get(position).toString());

    return convertView;
}