我正在开发一个目录应用程序,它看起来类似于 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;