错误原因:java.lang.OutOfMemoryError 加载图像
Posted
技术标签:
【中文标题】错误原因:java.lang.OutOfMemoryError 加载图像【英文标题】:error Caused by: java.lang.OutOfMemoryError Load Image 【发布时间】:2014-05-26 21:19:49 【问题描述】:这是我在后台加载图片的方法,第一次和第二次正常加载。但是在这些加载之后,就会出现内存错误。我该如何解决这个问题?
public class MainArrayAdapterViewHolder extends ArrayAdapter<EmpresaListaPrincipal>
private final Context context;
private ArrayList<EmpresaListaPrincipal> data_array;
public DisplayImageOptions options;
public ImageLoader imageLoader = ImageLoader.getInstance();
public MainArrayAdapterViewHolder(Context context, ArrayList<EmpresaListaPrincipal> list_of_ids)
super(context, R.layout.main_list_rowlayout, list_of_ids);
this.context = context;
this.data_array = list_of_ids;
//------------- read more here https://github.com/nostra13/android-Universal-Image-Loader
options = new DisplayImageOptions.Builder().showImageForEmptyUri(R.drawable.ic_launcher).showImageOnFail(R.drawable.ic_launcher).resetViewBeforeLoading()
.cacheOnDisc().imageScaleType(ImageScaleType.IN_SAMPLE_INT).bitmapConfig(Bitmap.Config.RGB_565).delayBeforeLoading(0).build();
File cacheDir = StorageUtils.getCacheDirectory(context);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context).memoryCacheExtraOptions(720, 1280) // default = device screen
// dimensions
.discCacheExtraOptions(720, 1280, CompressFormat.JPEG, 100).threadPoolSize(3) // default
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.memoryCacheSize(2 * 1024 * 1024).discCache(new UnlimitedDiscCache(cacheDir)) // default
.discCacheSize(50 * 1024 * 1024).discCacheFileCount(100).discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(context)) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.defaultDisplayImageOptions(options) // default
.build();
imageLoader.init(config);
@Override
public View getView(int position, View convertView, ViewGroup parent)
ViewHolder viewholder;
View v = convertView;
//Asociamos el layout de la lista que hemos creado e incrustamos el ViewHolder
if(convertView == null)
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//View rowView = inflater.inflate(R.layout.main_list_rowlayout, parent, false);
v = inflater.inflate(R.layout.main_list_rowlayout, parent, false);
viewholder = new ViewHolder();
viewholder.textView_main_row_title = (TextView) v.findViewById(R.id.textView_main_row_title);
viewholder.imageView_restaurant_icon = (ImageView) v.findViewById(R.id.imageView_restaurant_icon);
viewholder.textView_main_row_direccion = (TextView) v.findViewById(R.id.textView_main_row_direccion);
v.setTag(viewholder);
ImageLoadingListener mImageLoadingListenr = new ImageLoadingListener()
@Override
public void onLoadingStarted(String arg0, View arg1)
// Log.e("* started *", String.valueOf("complete"));
@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap arg2)
// Log.e("* complete *", String.valueOf("complete"));
@Override
public void onLoadingCancelled(String arg0, View arg1)
@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2)
// TODO Auto-generated method stub
;
try
viewholder = (ViewHolder) v.getTag();
viewholder.textView_main_row_title.setText(data_array.get(position).getNOMBRE());
viewholder.textView_main_row_direccion.setText(data_array.get(position).getDIRECCION());
String image = data_array.get(position).getURL();
// ------- image ---------
try
if (image.length() > 4) imageLoader.displayImage(image, viewholder.imageView_restaurant_icon, options, mImageLoadingListenr);
catch (Exception ex)
//textView_main_row_title.setText(name);
//textView_main_row_address.setText(address);
catch (Exception e)
// TODO: handle exception
return v;
public class ViewHolder
public TextView textView_main_row_title;
public TextView textView_main_row_direccion;
//public TextView cargo;
public ImageView imageView_restaurant_icon;
是的,我找到代码并调用了几次按活动填充图片
private Drawable getImageFromUrl(String url) 抛出异常 return Drawable.createFromStream((InputStream)new URL(url).getContent(), "src"); 在此输入代码
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
//declare variable of ImageView
ImageView bmImage;
public DownloadImageTask(ImageView bmImage)
//initialize variable with the passing ImageView parameter
this.bmImage = bmImage;
protected Bitmap doInBackground(String... urls)
//get url of image
String urldisplay = urls[0];
//create Bitmap variable
Bitmap mIcon11 = null;
try
//create instance of InputStream and pass URL
InputStream in = new java.net.URL(urldisplay).openStream();
//decode stream and initialize bitmap
mIcon11 = BitmapFactory.decodeStream(in);
catch (Exception e)
//show error log
Log.e("Error", e.getMessage());
e.printStackTrace();
//return bitmap
return mIcon11;
protected void onPostExecute(Bitmap result)
//get bitmap and initialize ImageView
try
bmImage.setImageBitmap(result);
catch (Exception e)
// TODO: handle exception
使用毕加索
在此处输入代码
public class MainArrayAdapterViewHolder extends ArrayAdapter<EmpresaListaPrincipal>
private final Context context;
private ArrayList<EmpresaListaPrincipal> data_array;
public DisplayImageOptions options;
public ImageLoader imageLoader = ImageLoader.getInstance();
public MainArrayAdapterViewHolder(Context context, ArrayList<EmpresaListaPrincipal> list_of_ids)
super(context, R.layout.main_list_rowlayout, list_of_ids);
this.context = context;
this.data_array = list_of_ids;
@Override
public View getView(int position, View convertView, ViewGroup parent)
ViewHolder viewholder;
View v = convertView;
//Asociamos el layout de la lista que hemos creado e incrustamos el ViewHolder
if(convertView == null)
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//View rowView = inflater.inflate(R.layout.main_list_rowlayout, parent, false);
v = inflater.inflate(R.layout.main_list_rowlayout, parent, false);
viewholder = new ViewHolder();
viewholder.textView_main_row_title = (TextView) v.findViewById(R.id.textView_main_row_title);
viewholder.imageView_restaurant_icon = (ImageView) v.findViewById(R.id.imageView_restaurant_icon);
viewholder.textView_main_row_direccion = (TextView) v.findViewById(R.id.textView_main_row_direccion);
v.setTag(viewholder);
try
viewholder = (ViewHolder) v.getTag();
viewholder.textView_main_row_title.setText(data_array.get(position).getNOMBRE());
viewholder.textView_main_row_direccion.setText(data_array.get(position).getDIRECCION());
String image = data_array.get(position).getURL();
Picasso.with(context)
.load(image)
.into(viewholder.imageView_restaurant_icon);
catch (Exception e)
// TODO: handle exception
return v;
public class ViewHolder
public TextView textView_main_row_title;
public TextView textView_main_row_direccion;
public ImageView imageView_restaurant_icon;
和其他活动使用picaso。
如果(ImagenObj != null)
for (int i = 0; i < ImagenObj.length(); i++)
JSONObject c = ImagenObj.getJSONObject(i);
// Storing each json item in variable
int id = Integer.parseInt( c.getString(ValoresGenerales.TAG_ID));
String nombre = c.getString(ValoresGenerales.TAG_NOMBRE);
String url = c.getString(ValoresGenerales.TAG_URL);
if(ValoresGenerales.TAG_SECUNDARIA_A.equals(nombre))
url_A = url;
else if(ValoresGenerales.TAG_SECUNDARIA_B.equals(nombre))
url_B = url;
else if(ValoresGenerales.TAG_SECUNDARIA_C.equals(nombre))
url_C = url;
else if(ValoresGenerales.TAG_SECUNDARIA_D.equals(nombre))
url_D = url;
else if(ValoresGenerales.TAG_ACERCA_DE.equals(nombre))
url_Acerca_de = url;
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if(!url_A.equals(""))
Picasso.with(m_context).load(url_A).into(imageViewA);
if(!url_B.equals(""))
Picasso.with(m_context).load(url_B).into(imageViewB);
if(!url_C.equals(""))
Picasso.with(m_context).load(url_C).into(imageViewC);
if(!url_D.equals(""))
Picasso.with(m_context).load(url_D).into(imageViewD);
if(!url_Acerca_de.equals(""))
Picasso.with(m_context).load(url_Acerca_de).into(iv_acerca_de);
enter code here
这是堆栈跟踪:
05-26 22:57:34.690: E/ActivityThread(22261): Failed to inflate
05-26 22:57:34.690: E/ActivityThread(22261): android.view.InflateException: Binary XML file line #112: Error inflating class <unknown>
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.createView(LayoutInflater.java:613)
05-26 22:57:34.690: E/ActivityThread(22261): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-26 22:57:34.690: E/ActivityThread(22261): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:323)
05-26 22:57:34.690: E/ActivityThread(22261): at android.app.Activity.setContentView(Activity.java:1881)
05-26 22:57:34.690: E/ActivityThread(22261): at com.example.lookrestaurant.actDetalleRestaurant.onCreate(actDetalleRestaurant.java:94)
05-26 22:57:34.690: E/ActivityThread(22261): at android.app.Activity.performCreate(Activity.java:5104)
05-26 22:57:34.690: E/ActivityThread(22261): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-26 22:57:34.690: E/ActivityThread(22261): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
05-26 22:57:34.690: E/ActivityThread(22261): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
05-26 22:57:34.690: E/ActivityThread(22261): at android.app.ActivityThread.access$600(ActivityThread.java:153)
05-26 22:57:34.690: E/ActivityThread(22261): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
05-26 22:57:34.690: E/ActivityThread(22261): at android.os.Handler.dispatchMessage(Handler.java:99)
05-26 22:57:34.690: E/ActivityThread(22261): at android.os.Looper.loop(Looper.java:137)
05-26 22:57:34.690: E/ActivityThread(22261): at android.app.ActivityThread.main(ActivityThread.java:5227)
05-26 22:57:34.690: E/ActivityThread(22261): at java.lang.reflect.Method.invokeNative(Native Method)
05-26 22:57:34.690: E/ActivityThread(22261): at java.lang.reflect.Method.invoke(Method.java:511)
05-26 22:57:34.690: E/ActivityThread(22261): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
05-26 22:57:34.690: E/ActivityThread(22261): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
05-26 22:57:34.690: E/ActivityThread(22261): at dalvik.system.NativeStart.main(Native Method)
05-26 22:57:34.690: E/ActivityThread(22261): Caused by: java.lang.reflect.InvocationTargetException
05-26 22:57:34.690: E/ActivityThread(22261): at java.lang.reflect.Constructor.constructNative(Native Method)
05-26 22:57:34.690: E/ActivityThread(22261): at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-26 22:57:34.690: E/ActivityThread(22261): at android.view.LayoutInflater.createView(LayoutInflater.java:587)
05-26 22:57:34.690: E/ActivityThread(22261): ... 32 more
05-26 22:57:34.690: E/ActivityThread(22261): Caused by: java.lang.OutOfMemoryError
05-26 22:57:34.690: E/ActivityThread(22261): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-26 22:57:34.690: E/ActivityThread(22261): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
05-26 22:57:34.690: E/ActivityThread(22261): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
05-26 22:57:34.690: E/ActivityThread(22261): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
05-26 22:57:34.690: E/ActivityThread(22261): at android.content.res.Resources.loadDrawable(Resources.java:1992)
05-26 22:57:34.690: E/ActivityThread(22261): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
05-26 22:57:34.690: E/ActivityThread(22261): at android.widget.ImageView.<init>(ImageView.java:120)
05-26 22:57:34.690: E/ActivityThread(22261): at android.widget.ImageView.<init>(ImageView.java:110)
05-26 22:57:34.690: E/ActivityThread(22261): ... 35 more
05-26 22:57:34.690: D/AndroidRuntime(22261): Shutting down VM
05-26 22:57:34.690: W/dalvikvm(22261): threadid=1: thread exiting with uncaught exception (group=0x41001930)
05-26 22:57:34.705: E/AndroidRuntime(22261): FATAL EXCEPTION: main
05-26 22:57:34.705: E/AndroidRuntime(22261): java.lang.RuntimeException: Unable to start activity ComponentInfocom.example.lookrestaurant/com.example.lookrestaurant.actDetalleRestaurant: android.view.InflateException: Binary XML file line #112: Error inflating class <unknown>
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.app.ActivityThread.access$600(ActivityThread.java:153)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.os.Handler.dispatchMessage(Handler.java:99)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.os.Looper.loop(Looper.java:137)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.app.ActivityThread.main(ActivityThread.java:5227)
05-26 22:57:34.705: E/AndroidRuntime(22261): at java.lang.reflect.Method.invokeNative(Native Method)
05-26 22:57:34.705: E/AndroidRuntime(22261): at java.lang.reflect.Method.invoke(Method.java:511)
05-26 22:57:34.705: E/AndroidRuntime(22261): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
05-26 22:57:34.705: E/AndroidRuntime(22261): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
05-26 22:57:34.705: E/AndroidRuntime(22261): at dalvik.system.NativeStart.main(Native Method)
05-26 22:57:34.705: E/AndroidRuntime(22261): Caused by: android.view.InflateException: Binary XML file line #112: Error inflating class <unknown>
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.createView(LayoutInflater.java:613)
05-26 22:57:34.705: E/AndroidRuntime(22261): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-26 22:57:34.705: E/AndroidRuntime(22261): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:323)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.app.Activity.setContentView(Activity.java:1881)
05-26 22:57:34.705: E/AndroidRuntime(22261): at com.example.lookrestaurant.actDetalleRestaurant.onCreate(actDetalleRestaurant.java:94)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.app.Activity.performCreate(Activity.java:5104)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
05-26 22:57:34.705: E/AndroidRuntime(22261): ... 11 more
05-26 22:57:34.705: E/AndroidRuntime(22261): Caused by: java.lang.reflect.InvocationTargetException
05-26 22:57:34.705: E/AndroidRuntime(22261): at java.lang.reflect.Constructor.constructNative(Native Method)
05-26 22:57:34.705: E/AndroidRuntime(22261): at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.view.LayoutInflater.createView(LayoutInflater.java:587)
05-26 22:57:34.705: E/AndroidRuntime(22261): ... 32 more
05-26 22:57:34.705: E/AndroidRuntime(22261): Caused by: java.lang.OutOfMemoryError
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.content.res.Resources.loadDrawable(Resources.java:1992)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.widget.ImageView.<init>(ImageView.java:120)
05-26 22:57:34.705: E/AndroidRuntime(22261): at android.widget.ImageView.<init>(ImageView.java:110)
05-26 22:57:34.705: E/AndroidRuntime(22261): ... 35 more
05-26 22:57:35.605: D/dalvikvm(22261): GC_FOR_ALLOC freed 1282K, 25% free 29998K/39940K, paused 22ms, total 25ms
05-26 22:57:36.485: D/dalvikvm(22261): GC_CONCURRENT freed 1883K, 25% free 30130K/39940K, paused 1ms+6ms, total 32ms
【问题讨论】:
请发布堆栈跟踪。 【参考方案1】:您遇到的问题是由于您尝试操作的Bitmaps
的大小,手机内存不足Bitmap
。确保您使用的分辨率有意义。
有很多不错的异步图片下载库可用。我可以建议Picasso。它甚至还有帮助您轻松调整图像大小的方法。
【讨论】:
谢谢,我会试试看.. 有什么方法可以从代码中控制图像的大小吗?和一个细胞星系 s3 .. 尺寸/重量是否正确? 你可以,毕加索让这一切变得容易。 非常感谢 .. 但是尝试 picasso 加载库 .. 一切都很好 .. 但是继续使用该应用程序给了我以下错误原因:android.graphics 上的 java.lang.OutOfMemoryError。 BitmapFactory.nativeDecodeStream(Native Method) Picasso .. 代码相当精简。我使用 Picasso.with(context) .load(image) .resize(50, 50) .centerCrop() .into(viewholder.imageView_restaurant_icon); 确保你的代码中没有其他部分像以前一样在操纵Bitmaps
。上面注释中显示的代码应避免使用OutOfMemoryException
。以上是关于错误原因:java.lang.OutOfMemoryError 加载图像的主要内容,如果未能解决你的问题,请参考以下文章