这是我在后台加载图像的方法,通常是第一次和第二次加载。但是在这些加载之后,会出现内存错误。我该如何解决这个问题?
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)throws Exception { 返回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
}
}
}
使用picaso
在这里输入代码
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。
if(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 ComponentInfo{com.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
答案 0 :(得分:0)
您遇到的问题是,由于您尝试操作Bitmap
的大小,手机的内存不足Bitmaps
。确保您使用的分辨率有意义。
有许多优秀的异步图像下载库可用。我可以建议Picasso。它甚至还有辅助方法,可以轻松调整图像大小。