Autore Topic: Errore java.lang.outOfMemory su CreazioneBitmap  (Letto 1167 volte)

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Errore java.lang.outOfMemory su CreazioneBitmap
« il: 27 Agosto 2013, 10:37:30 CEST »
0
Buongiorno a tutti :)
Qualcuno sa come fuorviare il problema del  BitmapFactory.decodeStream-decodeFile etc...con ERROR java.lang.OutOfMemory???
Ogni tanto compare questo errore
Codice: [Seleziona]
08-27 08:10:37.869: I/NOTIFICA ALLARMI(2314):  -1 -1 30 0 0 0 0 87 30 0 0 -111
08-27 08:32:40.569: E/AndroidRuntime(2945): FATAL EXCEPTION: main
08-27 08:32:40.569: E/AndroidRuntime(2945): java.lang.OutOfMemoryError
08-27 08:32:40.569: E/AndroidRuntime(2945):         at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
08-27 08:32:40.569: E/AndroidRuntime(2945):         at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527)
08-27 08:32:40.569: E/AndroidRuntime(2945):         at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:301)
Ho provato con questi ma niente da fare...naturalmente non voglio perder di qualità dell'immagine...e usando la funzione decodeFile() ne perdo e parecchia anche!
Codice (Java): [Seleziona]
//////////////PROGRAMMA

                                                         BitmapFactory.Options options = new BitmapFactory.Options();
                                                         options.inTempStorage = new byte[16*1024];
                                                         options.inJustDecodeBounds=false;
                                                         options.inPurgeable=true;
                                                        //options.mCancel=true;
                                                         //options.inSampleSize = calculateInSampleSize(options, lp.width, lp.height);
                                                         
                                                         

                                                         bitmap1 = BitmapFactory.decodeFile(bottone.getIcon(), options);
                                                         Drawable draw = new BitmapDrawable(getResources(),bitmap1);
                                                         *  File f=new File(bottone.getIcon());
                                                         bitmap1=decodeFile(f);
                                                         Drawable draw = new BitmapDrawable(getResources(),bitmap1);*/
                                                         img.setAdjustViewBounds(true);
                                                         img.setBackgroundDrawable(draw);

/////////////////////
       
       
       
        private Bitmap decodeFile(File f){
            try {
                //Decode image size
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(new FileInputStream(f),null,o);

                //The new size we want to scale to
                final int REQUIRED_SIZE=70;

                //Find the correct scale value. It should be the power of 2.
                int scale=1;
                while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE)
                    scale*=2;

                //Decode with inSampleSize
                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize=scale;
                return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
            } catch (FileNotFoundException e) {}
            return null;
        }
       
« Ultima modifica: 27 Agosto 2013, 10:48:06 CEST da MisterAnt »
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline vincenzoc

  • Utente junior
  • **
  • Post: 148
  • Respect: +47
    • Google+
    • cerminarav
    • Mostra profilo
    • Mie applicazioni sul Play Store
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Vincenzo Cerminara
  • Sistema operativo:
    Arch Linux
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #1 il: 27 Agosto 2013, 16:18:10 CEST »
+1
Ciao,
Ho avuto lo stesso problema con la mia ultima applicazione ed ho risolto facendo riferimento a questa pagina della documentazione ufficiale. Anche se ho visto che il tuo approccio nel codice è simile, dai un'occhiata e vedi se riesci a trarne qualcosa  :-)
Ringrazia chi ti aiuta sul forum con l'apposito pulsante :P
Scarica Yazzy

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #2 il: 29 Agosto 2013, 16:29:25 CEST »
+1
onestamente, dalla mia esperienza, ho capito che se se devi caricare molte immagini, puoi usare meccanismi + o - buoni per ottimizzare il tutto mai OOM c'è sempre. Ho quasi finito un'applicazione già esistente su piattaforma IOS e comparando l'uso della memoria su un iphone e samsung galaxiSIII ho notato una bella differenza. L'aspetto negativo è che il datore di lavoro vuole che le caratteristiche dell'applicazione siano uguali su entrambe le piattaforme, non sapendo però che se l'iphone utilizza 240mb di memoria non è un problema, mentre sul galaxySIII, arrivati a 64mb hai un OOM.

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #3 il: 31 Agosto 2013, 12:03:27 CEST »
0
Niente da fare...tutte le soluzioni mi portano a una perdita di qualità di immagini....
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #4 il: 01 Settembre 2013, 16:18:09 CEST »
0
Prova ad utilizzare il codice che ho scritto in questa discussione:
http://www.anddev.it/index.php/topic,11492.0.html

se leggi tutto il topic ci sono un altro paio di righe che dovresti aggiungere. Fammi sapere se funziona.

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #5 il: 07 Settembre 2013, 10:17:56 CEST »
0
Niente da fare, non riesco a capire come implementare i SoftReference<ImageView> e come utilizzarli...
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #6 il: 07 Settembre 2013, 17:34:21 CEST »
+1
io avevo lo stesso problema di OOM ma dopo svariati mesi e modificando il codice un po' alla volta sono arrivato ad un buon compromesso tra l'applicazione e l'OOM. Infatti non vado quasi + OOM. Questo fatto è dovuto principalmente a 2 cose:
1) In ogni attività in cui ci sono Thread, Runnable, Handler e ogni altro meccanismo che ha un ciclo di vita differente dall'attività, dichiaro questo oggetti statici in modo tale da non mantenere mai il contesto in cui "vivono".
2) Nelle attività dove ho tante tante immagini (ad esempio nelle attività dove ho listView) dichiaro le imageView di tipo SoftReference. Per usare le SoftReference puoi fare in questo modo:

Codice (Java): [Seleziona]
//questa è la softreference che contiene una imageview
private SoftReference<ImageView> sr;

//hai la tua imageView
private ImageView img;

img=(ImageView)findViewById(R.id.TuaImageview);
sr=new SoftReference<ImageView>(img);

//ora hai la tua imageview in un oggetto di tipo softreference, quindi ogni qual volta vuoi utilizzarla basta fare
sr.get()

//se vuoi ad esempio settarli una risorsa fai
sr.get().setImageResource(R.id.Risorsa);

//e cosi' via



//se invece vuoi creare una softreference con una  nuova imageview  (ti potrebbe servire nel caso in cui segui i pattern delle classi Wrapper per gli oggetti che //popolano le listview), ti faccio un'esempio:

private class WrapperView
        {
                private View base;
                private Context context;
                private SoftReference<ImageView> profileImg=null;
               
               
               
               
                public WrapperView(View base)
                {
                        this.base=base;
                        context=getApplicationContext();
                }
               
                private SoftReference<ImageView> getProfileImg()
                {
                        if(profileImg==null)
                        {
                                ImageView result = new ImageView(context);
                                result=(ImageView)base.findViewById(R.id.followcell_profileimg);
                                profileImg=new SoftReference<ImageView>(result);
                        }
                        return profileImg;
                       
                }

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #7 il: 09 Settembre 2013, 09:38:04 CEST »
0
Grazie !!!
Implementato...per un pochettino ha funzionato....
ma adesso compaiono lo stesso gli errori OOM...
« Ultima modifica: 09 Settembre 2013, 17:26:45 CEST da MisterAnt »
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #8 il: 09 Settembre 2013, 23:29:23 CEST »
0
Usi Handler e oggetti di tipo Runnable nella tua applicazione?

Offline MisterAnt

  • Utente normale
  • ***
  • Post: 272
  • Respect: +4
    • IlSikano
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S4 Active,Galaxy SIII I9300, Galaxy Tab GT-P5100
  • Play Store ID:
    MisterAnt
  • Sistema operativo:
    Ubuntu 12.04/Winzoz 7/Winzoz xp
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #9 il: 10 Settembre 2013, 09:01:33 CEST »
0
No...
Questo è il codice incriminato...
Codice (Java): [Seleziona]
img=null;
                                        img=new ImageView(this);
                                        sr=new SoftReference<ImageView>(img);
                                        sr.get().setLayoutParams(lp);
                                        img_icon.setLayoutParams(lp);
                                        if(!bottone.getIcon().equals("null")){
                                                 try{
                                                         risorsa=Integer.parseInt(bottone.getIcon());
                                                         Log.i("load img","ok");
                                                         sr.get().setBackgroundResource(risorsa);
                                                 }catch(Exception d){
                                                         Bitmap bitmap1=null;
                                                         bm=new SoftReference<Bitmap>(bitmap1);
                                                         BitmapFactory.Options options = new BitmapFactory.Options();
                                                                options.inPurgeable = true;
                                                                options.inTempStorage = new byte[16*1024];
                                                                options.inJustDecodeBounds = false;
                                                                options.inDither = false;
                                                                options.inTargetDensity=0;
                                                         bitmap1 = BitmapFactory.decodeFile(bottone.getIcon(), options);
                                                         Drawable drawable = new BitmapDrawable(getResources(), bitmap1);
                                                         sr.get().setAdjustViewBounds(true);//.CENTER_CROP);//FIT_XY);
                                                         sr.get().setBackgroundDrawable(drawable);
                                                         drawable=null;
                                                         bitmap1=null;
                                                 }
                                        }
                                        img_icon.addView(sr.get());
Se le zampe del coniglio sono così fortunate, che fine ha fatto il coniglio?

Offline elfo83

  • Utente normale
  • ***
  • Post: 287
  • Respect: +23
    • Mostra profilo
  • Sistema operativo:
    Mac OS 10.8.2
Re:Errore java.lang.outOfMemory su CreazioneBitmap
« Risposta #10 il: 10 Settembre 2013, 16:37:26 CEST »
0
Secondo me  vai OOM perchè non stai scalando l'immagine. Prova con questo codice dentro il catch:


Codice (Java): [Seleziona]
  BitmapFactory.Options o = new BitmapFactory.Options();
           o.inPurgeable = true;
           o.inJustDecodeBounds = true;
         
            BitmapFactory.decodeFile(bottone.getIcon(), options);
           
            final int REQUIRED_SIZE=240;
            int width_tmp=o.outWidth, height_tmp=o.outHeight;
         
            //with 100<size<140 scale =1 or scale 2
            int scale=2;
            while(true){
                if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                    break;
                width_tmp/=2;
                height_tmp/=2;
                scale*=2;
            }
           
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize=scale;
            bitmap1 = BitmapFactory.decodeFile(bottone.getIcon(),  o2);

             Drawable drawable = new BitmapDrawable(getResources(), bitmap1);
                                                         sr.get().setAdjustViewBounds(true);//.CENTER_CROP);//FIT_XY);
                                                         sr.get().setBackgroundDrawable(drawable);
                                                         drawable=null;
                                                         bitmap1=null;

Praticamente, se la tua immagine supera i 240px viene scalata. Ovviamente questo valore puoi settarlo a tuo piacimento.