为什么我的应用程序使用所有的内存,并得到OutOfMemoryError:分配失败?

为什么这一直发生?我甚至没有位图回收,我不知道为什么我的应用程序抛出内存错误。

我从图库中select图像是代码从图库中获取图像,然后显示在一些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); } } } 

之后,在用户图像(从图库中挑选)下面有3个图像button。 当用户按其中每一个将获得该图像的名称绘制,并将发送到另一个活动,然后我想水印用户图像在该图像button,并显示在一个图像查看

 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); } 

这是水印活动的代码

  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); } } 

现在这个代码工作如此之快的2或3次按下imagebuttons去水印活动,但它不断变得越来越慢,有时它冻结在模拟器中,我看到这些在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) 

我认为这是像我这样的许多其他人的问题…任何帮助将不胜感激。

Solutions Collecting From Web of "为什么我的应用程序使用所有的内存,并得到OutOfMemoryError:分配失败?"

也许在应用程序标签的Manifest中添加这一行将有助于您;

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

在Android 5上有类似的问题。将图像移动到/ drawable-nodpi而不是/ drawable

如果您正在使用模拟器进行testing尝试将虚拟设备的Ram设置为2GB左右。 我在虚拟设备上有同样的问题,但程序运行顺利在我的物理Android设备上