【发布时间】:2017-10-16 10:52:34
【问题描述】:
我创建了简单的图库,但是当我在几秒钟后尝试显示它时,应用程序崩溃并出现错误:
Throwing OutOfMemoryError "Failed to allocate a 31961100 byte allocation with 16777216 free bytes and 19MB until OOM"
我必须承认,当我尝试在图库中仅显示一张小于 1MB 的照片时会发生这种情况
可能这一切都发生了,因为我得到了这个 .jpg 文件,它应该被解码 Bitmap ?或者可能是因为我没有创建它的缩略图?还有一张照片需要160RAM?!?!很奇怪。如果我想让它在超过 1 张图片的情况下快速流畅地工作,我该怎么办:)。一些示例代码会很棒。
在我所有的代码下面
对话框库:
public void openDialog() {
inflater = this.getLayoutInflater();
// Dialog layout
v = inflater.inflate(R.layout.dialog_choice, null);
// Get gridView from dialog_choice
gV = (GridView) v.findViewById(R.id.gridView);
// GridAdapter (Pass context and files list)
GridAdapter adapter = new GridAdapter(this, photoList);
// Set adapter
gV.setAdapter(adapter);
final AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
builder2.setTitle("MY GALLERY");
builder2.setView(v);
builder2.setPositiveButton("NEXT", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setNegativeButton("BACK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder2.setCancelable(false);
builder2.create().show();
}
网格适配器:
public class GridAdapter extends BaseAdapter {
Context mContext;
ArrayList<File> listFiles;
public GridAdapter(Context context, ArrayList<File> files) {
this.mContext = context;
this.listFiles = files;
}
@Override
public int getCount() {
return listFiles.size();
}
@Override
public Object getItem(int position) {
return listFiles.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null)
{
convertView = LayoutInflater.from(mContext).inflate(R.layout.my_grid, parent, false);
}
ImageView iv = (ImageView) convertView.findViewById(R.id.imageView);
iv.setImageURI(Uri.parse(listFiles.get(position).toString()));
return convertView;
}
}
其余使用的代码:
public ArrayList<File> photoList;
@Override public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.guide_photo_album);
photoList = imageReader(my_root);
}
private ArrayList<File> imageReader(File root)
{
ArrayList<File> a = new ArrayList<>();
File[] files = root.listFiles();
for(int i=0;i<files.length;i++)
{
if(files[i].isDirectory())
{
Bitmap bit = BitmapFactory.decodeFile(files[i].getAbsolutePath());
a.addAll(imageReader(files[i]));
}
else
{
if (files[i].getName().endsWith(".jpg"))
{
a.add(files[i]);
}
}
}
return a;
}
P.S 对不起,语言虚弱而混乱。
【问题讨论】:
-
您认为这有帮助吗?使用 160mb 内存的简单应用程序,您的想法是让应用程序获得更多内存 lol
-
亲爱的,请把你的问题写好Picasso 或 Glide 或 Universal Loader 用于制作 Image Gallery 类型的应用程序,并学习如何以编程方式压缩位图。
标签: android bitmap out-of-memory gallery thumbnails