Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Por qué mi aplicación utiliza toda la memoria y obtiene OutOfMemoryError: Error al asignar?

¿Por qué esto happeing todo el tiempo? No tengo ni un mapa de bits para reciclar y no sé por qué mi aplicación de error de memoria de lanzamiento.

I seleccionar la imagen de la galería aquí es el código para obtener una imagen de la galería a continuación, mostrarlo en algunos imageView.

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { ImageView b = (ImageView) findViewById(R.id.viewImage); super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == 1) { File f = new File(Environment.getExternalStorageDirectory().toString()); for (File temp : f.listFiles()) { if (temp.getName().equals("temp.jpg")) { f = temp; break; } } try { Bitmap bitmap; BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(), bitmapOptions); b.setImageBitmap(bitmap); String path = android.os.Environment .getExternalStorageDirectory() + File.separator + "Phoenix" + File.separator + "default"; f.delete(); OutputStream outFile = null; File file = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg"); try { outFile = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outFile); outFile.flush(); outFile.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } } else if (requestCode == 2) { Uri selectedImage = data.getData(); String[] filePath = { MediaStore.Images.Media.DATA }; Cursor c = getContentResolver().query(selectedImage,filePath, null, null, null); c.moveToFirst(); int columnIndex = c.getColumnIndex(filePath[0]); String picturePath = c.getString(columnIndex); c.close(); Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath)); Log.w("path of image from gallery......******************.........", picturePath+""); b.setImageBitmap(thumbnail); b.setTag(picturePath); } } } 

Después de eso hay 3 imagebuttons debajo de la imagen del usuario (que escogió de la galería). Cuando la prensa del usuario en cada uno de ellos conseguirá el nombre de ese imageView drawable y enviará a otra actividad entonces quiero watermark la imagen del usuario en ese Imagebutton y la demostración en una imagenView

 private static HashMap<Integer,String> activityMap = new HashMap<Integer,String>(); static { activityMap.put( R.id.agahi1,"agahi1"); activityMap.put( R.id.agahi2,"agahi2"); } // use this in the layout xml file for all the buttons onClick attribute public void Clicked( View vw ) { String a = String.valueOf(activityMap.get(vw.getId())); Intent i = new Intent(this,fotCreator.class); ImageView b = (ImageView) findViewById(R.id.viewImage); String c = (String) b.getTag(); i.putExtra("image",c); i.putExtra("frame",a); startActivity(i); } 

Este es el código para la actividad watermarker

  package net.svncorp.shadikade; import android.content.Intent; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.ProgressBar; public class fotCreator extends ActionBarActivity { private AsyncCaller myasync; private ProgressBar bar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fot_creator); //progress bar bar = (ProgressBar) this.findViewById(R.id.progressBar); MainActivity.checkversion(this); } @Override public void onBackPressed() { super.onBackPressed(); this.finish(); } @Override protected void onResume() { super.onResume(); myasync = new AsyncCaller(); myasync.execute(); } private class AsyncCaller extends AsyncTask<Void, Void, Drawable> { @Override protected void onPreExecute() { super.onPreExecute(); bar.setVisibility(View.VISIBLE); } @Override protected Drawable doInBackground(Void... params) { try { // simulate here the slow activity Intent intent = getIntent(); final String frame = intent.getStringExtra("frame"); String image = intent.getStringExtra("image"); Resources resources = getResources(); int id = resources.getIdentifier(frame, "drawable", getPackageName()); Drawable d = resources.getDrawable(id); return d; } catch (Exception e1) { e1.printStackTrace(); } return null; } @Override protected void onPostExecute(Drawable result) { super.onPostExecute(result); //this method will be running on UI thread ImageView finalimage = (ImageView)findViewById(R.id.finalimage); if (isCancelled() || result == null) { return; } finalimage.setImageDrawable(result); bar.setVisibility(View.GONE); } } @Override protected void onPause() { super.onPause(); myasync.cancel(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_fot_creator, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 

Ahora este código funciona tan rápido por 2 o 3 veces de presionar imagebuttons e ir a watermarker activty pero su seguir recibiendo más lento y más lento ya veces se congela en el emulador y veo estos en logcat

  11-24 15:01:45.960 7751-7769/net.svncorp.shadikade I/art﹕ Alloc concurrent mark sweep GC freed 2419(163KB) AllocSpace objects, 1(1047KB) LOS objects, 12% free, 13MB/15MB, paused 0 total 30ms 11-24 15:01:48.760 7751-7768/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB 11-24 15:01:48.760 7751-7768/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB 11-24 15:01:48.760 7751-7768/net.svncorp.shadikade I/art﹕ Forcing collection of SoftReferences for 1047KB allocation 11-24 15:01:48.790 7751-7768/net.svncorp.shadikade I/art﹕ Alloc concurrent mark sweep GC freed 1303(86KB) AllocSpace objects, 1(993KB) LOS objects, 12% free, 13MB/15MB, paused 0 total 30ms 11-24 15:01:53.700 7751-7751/net.svncorp.shadikade I/Choreographer﹕ Skipped 1272 frames! The application may be doing too much work on its main thread. 11-24 15:01:55.350 7751-7769/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB 11-24 15:01:55.350 7751-7769/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB 11-24 15:01:55.350 7751-7769/net.svncorp.shadikade I/art﹕ Forcing collection of SoftReferences for 993KB allocation 11-24 15:01:55.380 7751-7769/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB 11-24 15:01:55.380 7751-7769/net.svncorp.shadikade I/art﹕ Alloc concurrent mark sweep GC freed 218(9KB) AllocSpace objects, 0(0B) LOS objects, 5% free, 15MB/16MB, paused 0 total 30ms 11-24 15:01:55.380 7751-7769/net.svncorp.shadikade E/art﹕ Throwing OutOfMemoryError "Failed to allocate a 1017612 byte allocation with 954752 free bytes and 932KB until OOM" 11-24 15:01:55.380 7751-7769/net.svncorp.shadikade D/skia﹕ --- decoder->decode returned false 11-24 15:01:55.380 7751-7769/net.svncorp.shadikade E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2 Process: net.svncorp.shadikade, PID: 7751 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:300) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.OutOfMemoryError: Failed to allocate a 1017612 byte allocation with 954752 free bytes and 932KB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:973) at android.content.res.Resources.loadDrawableForCookie(Resources.java:2423) at android.content.res.Resources.loadDrawable(Resources.java:2330) at android.content.res.Resources.getDrawable(Resources.java:758) at android.content.res.Resources.getDrawable(Resources.java:724) at net.svncorp.shadikade.fotCreator$AsyncCaller.doInBackground(fotCreator.java:65) at net.svncorp.shadikade.fotCreator$AsyncCaller.doInBackground(fotCreator.java:45) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237)            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)            at java.lang.Thread.run(Thread.java:818) 

Creo que este es el problema de muchos otros como yo … Cualquier ayuda será apreciada.

3 Solutions collect form web for “¿Por qué mi aplicación utiliza toda la memoria y obtiene OutOfMemoryError: Error al asignar?”

Tal vez la adición de esta línea en Manifest en las etiquetas de aplicación le ayudará;

 <application ... ... android:largeHeap="true" > ...... ...... </application> 

Tenía un problema similar en Android 5. Mueva sus imágenes a / drawable-nodpi en lugar de / drawable

Si su emulador está usando para la prueba Intente fijar el RAM del dispositivo virtual a 2gb o tan. Tuve el mismo problema en el dispositivo virtual, pero el programa Ejecutar sin problemas en mi dispositivo físico Android

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.