2014-11-24 1 views
15

почему это happeing все время? У меня нет даже растрового изображения, чтобы переработать, и я не знаю, почему мое приложение выбрасывает ошибку памяти.Почему мое приложение использует всю память и получает OutOfMemoryError: Не удалось выделить?

Я выбираю изображение из галереи здесь - это код, чтобы получить изображение из галереи, а затем показать его на каком-нибудь изображении.

@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 кнопки изображения под изображением пользователя (который выбран из галереи). когда пользователь нажимает кнопку на каждом из них получит имя этого ImageView Drawable и отправить на другой вид деятельности, то я хочу, чтобы водяной знак пользователя изображение на этом IMAGEBUTTON и шоу в одном ImageView

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

это код 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); 
    } 



} 

теперь этот код работает так быстро, в течение 2 или 3 раза нажать imagebuttons и перейти к Watermarker activty но продолжать получать все медленнее и медленнее, а иногда замерзают в эмуляторе и я вижу их в 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) 

Я думаю, что это проблема многих других, таких как я ... Любая помощь будет оценена.

+0

Я вижу ваши настройки Изображение растровое изображение, а затем изменение размера одного и того же растрового изображения. Возможно, дать образное изображение простой копии растрового изображения. – danny117

ответ

43

Возможно добавление этой строки в манифест на теги приложений поможет вам;

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

    ...... 
    ...... 

</application> 
+1

использовал его и не повезло ... в любом случае спасибо –

+0

@NikaAmiri как вы его решили? Я столкнулся с той же проблемой. –

+1

@DenJo не настоящий ответ на эту проблему, но я думаю, что проблема существует только на эмуляторе –

6

Если вы используете эмулятор для тестирования Попробуйте установить Рам виртуального устройства на 2 ГБ или около того. я была такая же проблема на виртуальном устройстве, но программа Run гладко на моем физическом устройстве Android

15

Если бы аналогичный вопрос на Android 5. Перемещение изображения в/вытяжке-nodpi вместо/вытяжки

+0

Почему? Не могли бы вы объяснить, пожалуйста? – Ton

+7

@ Если вы поместите свои изображения в/drawable-nodpi, андроид сохранит свой размер. – bhadz

+0

Я думаю, что это имеет какое-то отношение к автоматическому масштабированию изображения с использованием текущего устройства DPI. Изображения из/drawable-nodpi не масштабируются. – Borzh

Смежные вопросы