Autore Topic: Errore OutOfMemory  (Letto 418 volte)

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Errore OutOfMemory
« il: 13 Ottobre 2015, 22:55:23 CEST »
0
In una pagina della mia applicazione ci sono caricate troppe immagini che fungono da bottoni (ogni immagine è una figura geometrica diversa cliccandola ti da le formule per quella figura e ogni immagine è in formato png e pesa 41,3 kb), il problema è che ovviamente la ram non riesce a leggerle tutte e alla fine mi da l'errore OutOfMemory, le immagini sono disposte in un relativelayout vi passo il codice dell'activity anche se è basilare(a secondo della lingua sceglie o le immagini inglesi o quelle italiane):

Activity:
Codice (Java): [Seleziona]
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_forme);
        final RelativeLayout campo1 = (RelativeLayout) findViewById(R.id.campo1);
        final ImageView nero = (ImageView) findViewById(R.id.nero);
        final TextView titolo = (TextView) findViewById(R.id.titolo);
        final ImageView sottodesk = (ImageView) findViewById(R.id.sottodesk);

        final ImageView quadrato = (ImageView) findViewById(R.id.Quadrato);
        final ImageView rettangolo = (ImageView) findViewById(R.id.Rettangolo);
        final ImageView rombo = (ImageView) findViewById(R.id.Rombo);
        final ImageView parallelogramma = (ImageView) findViewById(R.id.Parallelogramma);
        final ImageView triangolo = (ImageView) findViewById(R.id.Triangolo);
        final ImageView trapezio = (ImageView) findViewById(R.id.Trapezio);
        final ImageView cerchio = (ImageView) findViewById(R.id.Cerchio);
        final ImageView coronacircolare = (ImageView) findViewById(R.id.Corona_Circolare);
        final ImageView pentagono = (ImageView) findViewById(R.id.Pentagono);
        final ImageView esagono = (ImageView) findViewById(R.id.Esagono);
        final ImageView ottagono = (ImageView) findViewById(R.id.Ottagono);
        final ImageView dodecagono = (ImageView) findViewById(R.id.Dodecagono);
        final ImageView sfera = (ImageView) findViewById(R.id.Sfera);
        final ImageView cilindro = (ImageView) findViewById(R.id.Cilindro);
        final ImageView cono = (ImageView) findViewById(R.id.Cono);
        final ImageView cubo = (ImageView) findViewById(R.id.Cubo);
        final ImageView cuboide = (ImageView) findViewById(R.id.Cuboide);
        final ImageView prisma = (ImageView) findViewById(R.id.Prisma);
        final ImageView tetraedro = (ImageView) findViewById(R.id.Tetraedro);
        final ImageView piramide = (ImageView) findViewById(R.id.Piramide);

        final ImageView Square2 = (ImageView) findViewById(R.id.Square2);
        final ImageView Quadrato2 = (ImageView) findViewById(R.id.Quadrato2);
        final ImageView Rectangle2 = (ImageView) findViewById(R.id.Rectangle2);
        final ImageView Rettangolo2 = (ImageView) findViewById(R.id.Rettangolo2);
        final ImageView Rhombus2 = (ImageView) findViewById(R.id.Rhombus2);
        final ImageView Rombo2 = (ImageView) findViewById(R.id.Rombo2);
        final Button parallelogramma2 = (Button) findViewById(R.id.button40);
        final Button triangoloequilatero2 = (Button) findViewById(R.id.button41);
        final Button triangoloisoscele2 = (Button) findViewById(R.id.button42);
        final Button triangolorettangolo2 = (Button) findViewById(R.id.button43);
        final Button trapeziorettangolo2 = (Button) findViewById(R.id.button44);
        final Button trapezioisoscele2 = (Button) findViewById(R.id.button45);
        final Button pentagono2 = (Button) findViewById(R.id.button46);
        final Button esagono2 = (Button) findViewById(R.id.button47);
        final Button ottagono2 = (Button) findViewById(R.id.button48);
        final Button dodecagono2 = (Button) findViewById(R.id.button49);




        //----------------------------------------------------------
        //apro il database
        helper = new LocalDB1Helper(context);
        sqldatabase = helper.getReadableDatabase();

        //sfrutto il database
        //leggo il database
        Cursor c=helper.getInformations(sqldatabase); // query
        startManagingCursor(c);


        if(c.moveToFirst()){
            int linguaint=c.getColumnIndex(LocalDB1.tabella1.USER_LINGUAGGIO);
            DataProvider2 dataprovider2 = new DataProvider2 (lingua2);
            lingua2 = c.getString(0);
            lingua = Integer.parseInt(lingua2);
        }
        //-------------------------------------------------------------
        if(lingua == 0){

            quadrato.setBackgroundResource(R.drawable.dsq_eng);

            rettangolo.setBackgroundResource(R.drawable.drr_eng);
            rombo.setBackgroundResource(R.drawable.drm_eng);
            parallelogramma.setBackgroundResource(R.drawable.spp_eng);
            triangolo.setBackgroundResource(R.drawable.dtt_eng);
            trapezio.setBackgroundResource(R.drawable.dtp_eng);
            cerchio.setBackgroundResource(R.drawable.dcc_eng);
            coronacircolare.setBackgroundResource(R.drawable.dcr_eng);
            pentagono.setBackgroundResource(R.drawable.dpp_eng);
            esagono.setBackgroundResource(R.drawable.deh_eng);
            ottagono.setBackgroundResource(R.drawable.doo_eng);
            dodecagono.setBackgroundResource(R.drawable.ddd_eng);
            sfera.setBackgroundResource(R.drawable.dsr_eng);
            cilindro.setBackgroundResource(R.drawable.dcl_eng);
            cono.setBackgroundResource(R.drawable.dcn_eng);
            cubo.setBackgroundResource(R.drawable.dcb_eng);
            cuboide.setBackgroundResource(R.drawable.dppl_eng);
            prisma.setBackgroundResource(R.drawable.dpm_eng);
            tetraedro.setBackgroundResource(R.drawable.dpp_eng);
            piramide.setBackgroundResource(R.drawable.dpp_eng);
        }
        if(lingua ==1){
            quadrato.setBackgroundResource(R.drawable.dsq_ita);
            rettangolo.setBackgroundResource(R.drawable.drr_ita);
            rombo.setBackgroundResource(R.drawable.drm_ita);
            parallelogramma.setBackgroundResource(R.drawable.spp_ita);
            triangolo.setBackgroundResource(R.drawable.dtt_ita);
            trapezio.setBackgroundResource(R.drawable.dtp_ita);
            cerchio.setBackgroundResource(R.drawable.dcc_ita);
            coronacircolare.setBackgroundResource(R.drawable.dcr_ita);
            pentagono.setBackgroundResource(R.drawable.dpp_ita);
            esagono.setBackgroundResource(R.drawable.deh_ita);
            ottagono.setBackgroundResource(R.drawable.doo_ita);
            dodecagono.setBackgroundResource(R.drawable.ddd_ita);
            sfera.setBackgroundResource(R.drawable.dsr_ita);
            cilindro.setBackgroundResource(R.drawable.dcl_ita);
            cono.setBackgroundResource(R.drawable.dcn_ita);
            cubo.setBackgroundResource(R.drawable.dcb_ita);
            cuboide.setBackgroundResource(R.drawable.dppl_ita);
            prisma.setBackgroundResource(R.drawable.dpm_ita);
            tetraedro.setBackgroundResource(R.drawable.dpp_ita);
            piramide.setBackgroundResource(R.drawable.dpp_ita);
            Quadrato2.setVisibility(View.VISIBLE);
            Rettangolo2.setVisibility(View.VISIBLE);
            Rombo2.setVisibility(View.VISIBLE);
        }
        titolo.setText(titolotesto[lingua]);

Tutto qua, io vorrei che non crasha, navigando nel web ho trovato casi non del tutto simili al mio e da quel che ho capito devo convertire da png a bitmap tramite codice e poi ricycle()... mi potete chiarire le idee?
« Ultima modifica: 13 Ottobre 2015, 22:57:02 CEST da Dr.Joek »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Errore OutOfMemory
« Risposta #1 il: 13 Ottobre 2015, 23:23:23 CEST »
0
Usa una listview

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Re:Errore OutOfMemory
« Risposta #2 il: 13 Ottobre 2015, 23:40:39 CEST »
0
Posso provarci a creare una gridview, ma non c'è un modo per riciclare le immagini che non si visualizzano senza ausilio di una gridview/listview?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Errore OutOfMemory
« Risposta #3 il: 13 Ottobre 2015, 23:42:48 CEST »
0
Sinceramente non lo so. Penso che listview o griglia aumenti anche l' usabilità della tua applicazione.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Errore OutOfMemory
« Risposta #4 il: 14 Ottobre 2015, 01:05:10 CEST »
0
Hai creato per ogni schermo sopportato tante immagini con i DPI corrispondenti o hai un solo set di immagini per tutti i tipi di schermi, magari con un DPI spropositato?

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline iClaude

  • Utente normale
  • ***
  • Post: 243
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Errore OutOfMemory
« Risposta #5 il: 14 Ottobre 2015, 11:04:04 CEST »
0
Per iniziare dovresti quantomeno seguire questi accorgimenti per gestire le immagini in modo efficiente:
https://developer.android.com/training/displaying-bitmaps/index.html

in particolare caricarle in un thread separato e ridimensionarle in base alle dimensioni richieste.
Poi se puoi comprimere le immagini o caricare diverse immagini a seconda del dispositivo anche questo aiuta.

Offline Dr.Joek

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Emulatore a gogo
  • Sistema operativo:
    Windows7, Windows8.1, Ubuntu15.3, Windows10
Re:Errore OutOfMemory
« Risposta #6 il: 14 Ottobre 2015, 21:10:27 CEST »
0
Problema risolto ho ridimensionato le immagini da 370 x 363 a 185 x 182 quindi da 41 kb a 29 kb per immagine, e ne ho fatto di un solo tipo (mdpi) perchè poi l'app le ridimensiona a 108 dp x 108 dp quindi 108 p * D, la massima densità è 4 (codice android) e allora mettendo il numero fisso di 185p x 182p a immagine quando sarà 108 * D l'immagine si allargherà di pochissimo e l'occhio umano non se ne accorge (o almeno il mio)