0

在这里,我创建了可扩展的列表视图,其中有艺术家的组行,并在小孩它显示专辑艺术家与专辑艺术的所有专辑。但它会抛出内存异常。内存溢出异常虽然获取AlbumArt

这里是我的代码来获取图像:

public static Bitmap getArtwork(Context context, int album_id) { 

     ContentResolver res = context.getContentResolver(); 
     Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id); 
     if (uri != null) 
     { 
      InputStream in = null; 
      try 
      { 
       in = res.openInputStream(uri); 
       return BitmapFactory.decodeStream(in, null, sBitmapOptions); 
      } catch (FileNotFoundException ex) 
      { 
       // The album art thumbnail does not actually exist. Maybe the user deleted it, or 
       // maybe it never existed to begin with. 
      } finally 
      { 
        if (in != null) 
        { 
         try 
         { 
          in.close(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     return null; 
    } 

和创建子专辑列表我已经做到了这一点:

private ArrayList<ArrayList<HashMap<String, Object>>> createChildList() { 
    for (int i = 0; i < songsListData.size(); i++) 
    { 

     ArrayList<HashMap<String,Object>> secList = new ArrayList<HashMap<String,Object>>(); 
     String s[] = new String[]{songsListData.get(i).get("artistname")}; 
     String whereClause = MediaStore.Audio.Albums.ARTIST + " = ? "; 

     Cursor cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,null ,whereClause,s,null); 

     if (cursor == null) 
     { 
       //Query Failed , Handle error. 
     } 
     else if (!cursor.moveToFirst()) 
     { 
      //No media on the device. 
     } 
     else 
     {    
       int albumName = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM); 
       int id = cursor.getColumnIndex(MediaStore.Audio.Albums._ID); 
       int songcount = cursor.getColumnIndex(MediaStore.Audio.Albums.NUMBER_OF_SONGS); 

       for(int j=0;j<cursor.getCount();j++) 
       { 
        String Name = cursor.getString(albumName); 
        Integer albumid = cursor.getInt(id);       
        Bitmap bitmap = null; 
        bitmap = getArtwork(context, albumid); //calling function 
        if(bitmap == null) 
        { 
         bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.wallpaper); 
        } 
        HashMap<String, Object> album = new HashMap<String, Object>(); 
        album.put("albumName",Name); 
        album.put("albumId", albumid); 
        album.put("image", bitmap); //storing image 
        album.put("songcount",cursor.getString(songcount) + " song"); 
        secList.add(album); 
        cursor.moveToNext(); 
       }     
      } 
      cursor.close(); 
      albumData.add(secList); 
    } 
    return albumData; 
} 

我应该怎么做才能处理内存溢出异常? ?请让我解决一些问题。感谢名单。

回答

1

调试时,意外进入了 必须是由于增加图像的大小 可以使用Document进行了解你的代码和跟踪堆大小的Android如何计算图像大小

public static Bitmap getResizedBitmap(Bitmap image, int newHeight, int newWidth) { 
    int width = image.getWidth(); 
    int height = image.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // create a matrix for the manipulation 
    Matrix matrix = new Matrix(); 
    // resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 
    // recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(image, 0, 0, width, height, 
      matrix, false); 
    return resizedBitmap; 
} 
+0

应该怎么在存储到hashmap之前减少位图图像的高度和宽度? – zanky

+0

是第一次阅读文件,然后调试你的代码,并检查堆大小后,如何增加,如果你需要减少位图的大小,你可以使用上面的代码 –

+0

ohx thanx ..我正在尝试。 – zanky