Laggigt Navigation-Drawer, Android Studio (ImageView)

Permalänk
Medlem

Laggigt Navigation-Drawer, Android Studio (ImageView)

Tjenare!

Håller på att utveckla en applikation i Android där man ska byta bild i imageView med hjälp av Navigation-"lådan".
Jag kör med Navigation Drawer Activity som man kan välja i "Add an activity to Mobile". Utifrån där så bygger jag på funktionerna
och har lagt till en imageView, där bilder från drawable visas genom Navigation Drawer.
Och bilden byts med en switch-funktion. Där jag har 9 stycken cases.

Koden ser ut så här:

public void onSectionAttached(int number) { ImageView imageView =(ImageView)findViewById(R.id.imageView); switch (number) { case 1: mTitle = "Title"; imageView.setImageResource(R.drawable.namn_på_bild); break; case 2: mTitle = "Title"; imageView.setImageResource(R.drawable.namn_på_bild); break; case 3: mTitle = "Title"; imageView.setImageResource(R.drawable.namn_på_bild); break; case 4: mTitle = "Title"; imageView.setImageResource(R.drawable.namn_på_bild); break; case 5: mTitle = "Title"; imageView.setImageResource(R.drawable.namn_på_bild); break; case 6: mTitle = "Title"; imageView.setImageResource(R.drawable.namn_på_bild); break; case 7: mTitle = "Title"; imageView.setImageResource(R.drawable.namn_på_bild); break; case 8: mTitle = "Title"; imageView.setImageResource(R.drawable.namn_på_bild); break; case 9: mTitle = "Title"; imageView.setImageResource(R.drawable.namn_på_bild); break; } }

Nu så har jag bara gjort om koden för demonstration. Alla cases har unika namn på bilderna samt titlar.

Allt fungerar som det ska, men när man har öppnat navigationen(swipa från vänster) och valt så flyttar sig själva navigations-"lådan" lite tillbaka och laddar bilden. Och det hela tar uppemot 2-5 sekunder och laggar... Finns det något knep för att få det hela att se bättre ut/flyta på?
Uppskattar tips.
P.S. Jag är nybörjare till Android SDK och Java och behöver därför lite hjälp på traven...

/Davvarn

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)

Permalänk

Tjena

Prövade att sätta upp samma sak själv och testade med liknande kod som du skrev, tyckte inte det var särskilt segt faktiskt. Kan det vara att du testar på en emulator som är seg?

En sak som kan göra att bilden hoppar till osv. är att du använder

setImageResource(int resId)

och enligt http://developer.android.com/reference/android/widget/ImageVi... så laddar den bilden på UI-tråden vilket kan göra att bilden hoppar till.
Tror det är bättre att använda sig av exempelvis

setImageDrawable(getDrawable(int resId))

Sedan är det nog inte så bra att använda findViewById(int id) så att den behöver hitta din ImageView varje gång onSectionAttached(int number) kallas.

Du kanske även har koll på att när man sätter upp en sådan Navigation Drawer Activity så får du ju en NavigationDrawerFragment som när ett alternativ väljs skickar vald position till MainActivity som startar en ny PlaceholderFragment med positionen som sedan använder onSectionAttached(int number). Om du bara byter bild i MainActivity så behöver ju inte PlaceholderFragment startas.

//Magnus

Permalänk
Medlem
Skrivet av magnusvons:

Tjena

Prövade att sätta upp samma sak själv och testade med liknande kod som du skrev, tyckte inte det var särskilt segt faktiskt. Kan det vara att du testar på en emulator som är seg?

En sak som kan göra att bilden hoppar till osv. är att du använder

setImageResource(int resId)

och enligt http://developer.android.com/reference/android/widget/ImageVi... så laddar den bilden på UI-tråden vilket kan göra att bilden hoppar till.
Tror det är bättre att använda sig av exempelvis

setImageDrawable(getDrawable(int resId))

Sedan är det nog inte så bra att använda findViewById(int id) så att den behöver hitta din ImageView varje gång onSectionAttached(int number) kallas.

Du kanske även har koll på att när man sätter upp en sådan Navigation Drawer Activity så får du ju en NavigationDrawerFragment som när ett alternativ väljs skickar vald position till MainActivity som startar en ny PlaceholderFragment med positionen som sedan använder onSectionAttached(int number). Om du bara byter bild i MainActivity så behöver ju inte PlaceholderFragment startas.

//Magnus

Tack för den snabba responsen. Kanske dock var lite otydlig, det är inte själva bilden som laggar. Utan det är när man har valt så fastnar Navigation-drawern ibland halvvägs och ibland lite mer än det ett litet tag.. Det flyter liksom inte på. Vet inte om jag använder rätt filtyp, jag använder png därför att det är genomskinlig bakgrund.
Jag provade även setImageDrawable och såg att det måste ha de senaste API-erna som 21 och uppåt. Jag hade tänkt att appen ska vara för API-level 19+

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)

Permalänk

Var själv kanske lite otydlig i mitt svar. Om man använder setImageResource så laddas bilden in med UI-tråden som sagt, UI-tråden hanterar allting som händer på skärmen och om den stoppas upp av att då ladda en stor bild så kan allting som visas på skärmen stanna tills det är klart. Det borde därför vara bättre tycker jag med setImageDrawable. Tycker inte heller att använda png borde vara något problem, med reservation då jag också skulle klassa mig själv som nybörjare inom android.
Varför du får upp att setImageDrawable behöver API 21+ vet jag inte, den ska ha funnits med sedan API 1.

Permalänk
Medlem

Nu har jag fått setImageDrawable att fungera, var tvungen att importera in @TargetApi(Build.VERSION_CODES.LOLLIPOP) innan public void onSectionAttached(int number)

Men fattar inte hur jag ska göra med findViewById som du pratade om. Hur ska jag annars hitta imageView? Om jag flyttar upp den raden så hittas inte den...

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)

Permalänk

Verkar konstigt, som sagt så borde setImageDrawable vara tillgängligt sedan API 1.

Menade att du deklarerar exempelvis ImageView myImageView; i din Activity, sedan inom onCreate så använder du imageView = findViewById(R.id...). Det gör att findViewById inte används varje gång onSectionAttached används vilket är att föredra då findViewById inte är så snabbt om jag minns rätt.

Permalänk
Medlem
Skrivet av magnusvons:

Verkar konstigt, som sagt så borde setImageDrawable vara tillgängligt sedan API 1.

Menade att du deklarerar exempelvis ImageView myImageView; i din Activity, sedan inom onCreate så använder du imageView = findViewById(R.id...). Det gör att findViewById inte används varje gång onSectionAttached används vilket är att föredra då findViewById inte är så snabbt om jag minns rätt.

Jag vet inte riktigt om jag har gjort rätt, då det fortfarande laggar till(navigations-drawern fastnar halvvägs tillbaka..) Det kan vara fel på mobilen också, vet inte. Jag kör appen på LG G3. Det känns som att det inte går att fixa problemet...

Mvh
/Davvarn

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)

Permalänk

Gissar att det inte är mobilen det är fel på men svårt för mig att säga vad det kan vara. Om du vill kan du lägga upp koden på exempelvis github så kan jag kika på den. Annars tycker jag det brukar vara lätt att hitta svar på stackoverflow inom liknande frågor om man bara har lite erfarenhet av vad man ska söka på, vilket kan vara svårt i början.

Permalänk
Medlem
Skrivet av magnusvons:

Gissar att det inte är mobilen det är fel på men svårt för mig att säga vad det kan vara. Om du vill kan du lägga upp koden på exempelvis github så kan jag kika på den. Annars tycker jag det brukar vara lätt att hitta svar på stackoverflow inom liknande frågor om man bara har lite erfarenhet av vad man ska söka på, vilket kan vara svårt i början.

Jag laddade upp det på min Google Drive istället då man tydligen inte kan göra inlägg på Github till privat utan att betala. Jag skickar ett PM med länken!

Visa signatur

Chassi: Fractal Design Meshify C Mini | CPU: AMD Ryzen 5 3600 | Kylare: Be Quiet! Dark Rock Pro 4 | Graffe: ASUS 1070 8GB ROG STRIX DC3 | PSU: Corsair RM750X V2 | RAM: Corsair Vengence 32GB 3200 MHz | MOBO: MSI B450M MORTAR MAX
CS:GO-Maps (App) Sweclockers (App)