Optimering bla. bilder i listview

Diskussion i 'Frågor, support och diskussion' startad av Pajn, 28 dec 2011.

  1. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 aug 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    Jag håller på med en Musikspelare och även fast jag är noob så går det faktiskt framåt :D

    Men jag har lite problem, vissa saker jag gör blir inte bra och långsamma så jag hoppas ni vill hjälpa till och lösa lite av mina problem.

    Jag vill ju såklart visa albumbilderna bredvid låtar och album samt artistbilder bredvid artister. Eftersom jag visar de i en listview (vad annars?) så har jag gjort en egen adapter som bara override:ar getView.
    När jag visar bilden gör jag:
    Kod:
    ImageView AlbumArt = (ImageView) v.findViewById(R.id.image);
    AlbumArt.setImageBitmap(art.getAlbum(AlbumID));
    Art är en class jag gjort för att hantera allt som har med bilderna att göra. getAlbum ser ut såhär:
    Kod:
    public Bitmap getAlbum(long ID) {
        String coverPath = null;
        Bitmap bm = null;
    		
        File tmp = new File (path + "r" + ID);
        if (tmp.isFile()) {
            coverPath = path + "r" + ID;
        }
    		
        if (coverPath != null) {
            bm = BitmapFactory.decodeFile(coverPath);
        }
    		
        return bm;
    }
    Detta fungerar men att scrolla i listan laggar lite smått och Logcat spammar ut meddelanden om att Garbage Collector har rensat.

    Jag misstänker att detta beror på att jag laddar in varje bild som en egen bild. Om en artist har två skivor och jag kollar på artistens alla låtar är det ju egentligen bara två gånger jag behöver ladda in en ny bild, men nu antar jag att jag laddar in en ny bild 20 gånger (om det är tio låtar på varje skiva). Rätt?
    Hur löser jag detta?

    Jag har funderat på en Array eller Arraylist som jag sparar in bilderna i och om jag vill visa samma bild igen plockar jag den barra från Arrayen. Men då är frågan, hjälper det? Är det kanske i själva visningen som det blir dumt? kommer det ligga en tung Array i minnet med en massa bilder som inte är intressanta längre?

    En annan grej. Själva uppspelningen ligger ju i en Service i en separat tråd. I de Activity:na som jag behöver kommunicera med Service:n måste jag ju skapa en anslutning, detta tar lite tid (under en sekund men det pajjar flytet ändå eftersom jag inte kan rita upp något undertiden). Det känns rätt dumt att behöva upprätta en ny anslutning i varje Activity, borde jag inte på nått sätt kunna spara undan den och återanvända den i hela programmet?
     
  2. Senap

    Senap Youth Droid Medlem

    Blev medlem:
    12 dec 2010
    Inlägg:
    113
    Mottagna gillanden:
    13

    MINA ENHETER

    GridView ;)
    Hello, GridView | Android Developers

    Kod:
    ImageView AlbumArt = (ImageView) v.findViewById(R.id.image);
    AlbumArt.setImageBitmap(art.getAlbum(AlbumID));
    Det där blir ganska tungt i slutändan, att köra findViewById varje gång getView anropas. Goggla efter "ListView ViewHolder", det är en metod som används flitigt i communityn för att bara köra findViewById några få gånger, i princip endast en gång per convertView.

    Jag tycker du endast bör kalla på getAlbum en gång för varje bild och sedan cacha bilderna i din adapter (eller ViewHolder om du kommer att använda den metoden), istället för att ladda in dem för varje list item. Om en bild behövs två gånger så använd samma cachade bild istället för att ladda in två bilder, osv.

    Försök inte göra för komplexa saker (exempelvis tunga uträkningar) i getView, ha helst all data redo (bilder cachade, strings för-formatterade) för att sedan bara spotta ut datan till dina widgets.
     
    Pajn gillar detta.
  3. Pajn

    Pajn Adult Droid Medlem

    Blev medlem:
    12 aug 2009
    Inlägg:
    606
    Mottagna gillanden:
    51

    MINA ENHETER

    EDIT: Text under kodrutan hamnar i den så för att läsa hela inlägget får du kolla i den :)

    Tackar!
    Jag slängde ihop det här:
    Kod:
    Snip
    Ska kolla mer på det imorgon nu kopierade och klistrade jag mest ifrån List14.java | Android Developers

    Men det går iaf. att scrolla utan problem nu och GCn gick inte en enda gång när jag skrollade upp och ner några gånger :)

    Visste inte att GridView gick att använda på det sättet. Skitbra då jag kommer att ha en grid layout som standard på artister och album. Trodde jag skulle behöva göra något suspekt med en ListView.

    EDIT2: Tog bort koden då kodrutan messade upp hela tråden.

    Det verkar fungera jättebra. Stort tack!
    Nu är det bara anslutningen till Servicen som måste fixas. Visst måste det gå att skicka vidare anslutningen mellan activityrna?
     
    Last edited: 30 dec 2011