0

我正在开发一个目录应用程序,它看起来类似于 Android 手机上的联系人应用程序,旁边有这个人的照片和他们的名字。但是,我需要从互联网上获取这些图像作为长字符串并将它们转换为图像。

在上下滚动联系人列表几次后,我收到“java.lang.OutOfMemoryError:位图大小超出 VM 预算”。

下面的代码中是否有明显的东西我应该做不同的事情?

将图像作为字符串下载并存储在 asynctask 中:

//Image doesn't exist, need to add
  try {
      FileOutputStream fOut = (activity.getApplicationContext()).openFileOutput(guid, 0);
      OutputStreamWriter osw = new OutputStreamWriter(fOut);
      osw.write(strImage);
      osw.flush();
      osw.close();
      contact.setImageLength(String.valueOf(strImage.length()));
      db.updateContact(contact);    
  } catch (IOException ioe) {
      ioe.printStackTrace();
  }

在列表适配器中显示图像:

case R.layout.listview_member_row:

LayoutInflater inflater4 = ((Activity)context).getLayoutInflater();
row = inflater4.inflate(layoutResourceId, parent, false);

holder = new PositionHolder();
holder.txtName = (TextView)row.findViewById(R.id.listview_member_name);
holder.imgPicture = (ImageView)row.findViewById(R.id.listview_picture);

try {
    FileInputStream fIn = context.openFileInput(contact.getContactId());
    InputStreamReader isr = new InputStreamReader(fIn);
    char[] inputBuffer = new char[Integer.parseInt(contact.getImageLength())];   
    isr.read(inputBuffer);
    String encodedImage = new String(inputBuffer);
    // Convert string to image 
    byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
    Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
    // Assign image to screen
    holder.imgPicture.setImageBitmap(decodedByte);
} catch (IOException oe) {
    oe.printStackTrace();
}
row.setTag(holder);

holder.txtName.setText(listItem.name);
holder.txtName.setTextSize(nameTextSize);
break;
4

0 回答 0