我在Google Glass设备上使用Parse.com,我正在尝试将大尺寸的ParseObject(大约50 MB)固定到本地数据存储区。我注意到,在堆内存超过10MB后,固定过程暂停,并且不会抛出任何异常。我还尝试按顺序固定一系列ParseObjects(同时),但是当堆达到10MB时,钉扎过程暂停。有时它比其他时间引脚更多的对象,所以我猜测Java GC有时比其他人更努力。请帮助我,或者给我一个替代方案,用于在内部存储大型物体(包含大量图像)。
答案 0 :(得分:0)
1)如果我正确理解了您的问题,您希望将图像存储在手机中(以便您的应用可以稍后检索),那么您可以尝试将其存储在SD卡中:
public static boolean storeImage(Bitmap bitmap, String filename) {
boolean stored = false;
String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() +
"/myFolder";
File dir = new File(file_path);
if(!dir.exists())
dir.mkdirs();
File fileToStored = new File(dir, filename + ".png");
try {
FileOutputStream outputStream = new FileOutputStream(fileToStored);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
outputStream.flush();
outputStream.close();
stored = true;
} catch (Exception e) {
e.printStackTrace();
}
return stored;
}
清单文件中需要*权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2)使用Parse 2个月后,还有另一个选项可以通过在Parse数据库中使用字符串来存储图像(注意Image列是一个字符串)和base64 decode / encode:
public static Bitmap decodeBase64(String input) {
if (input == null) return null;
byte[] decodedByte = Base64.decode(input, Base64.NO_WRAP);
return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
}
public static String encodeTobase64(Bitmap image) {
Bitmap immagex=image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b, Base64.NO_WRAP);
Log.e(TAG, "encoded Img: " + imageEncoded);
return imageEncoded;
}
*注意:使用NO_WRAP而不是DEFAULT,以便iOs应用程序也可以编码和解码您的字符串
3)存储图像的另一个选项,我更喜欢这是存储在服务器上,然后在需要时检索,你可以存储在自己的服务器上,或者使用其他着名的服务,我尝试过Imgur API并且它可以工作很棒(当然,如果您的应用每天没有1,250次上传或每天大约12,500次请求,则免费)
API文档: https://api.imgur.com/
Android上传示例: https://github.com/AKiniyalocts/imgur-android
如果您了解其他更好的方法,请随意发表评论。技术变化很快!