set adapter till lista från tråd??!?

Diskussion i 'Frågor, support och diskussion' startad av alioooop, 18 jun 2010.

  1. alioooop

    alioooop Adult Droid Medlem

    Blev medlem:
    16 jan 2010
    Inlägg:
    720
    Mottagna gillanden:
    11

    MINA ENHETER

    tjaa :) hade tänkt göra en tråd som skapar en adapter och sedan attachar den till en lista. problemet är att när jag gör det i tråden funkar det inte men flyttar jag ut skapningen av adapter och setAdapter() från tråden så funkar det klockrent!! men har ajg det utanför så hinner ju tråden inte förändra värdena innan adaptern skapas o sätts!!

    såhär ser min kod ut:

    Kod:
    ProgressDialog progDailog = ProgressDialog.show(News.this,"Progress dialog", "please wait....",true);
    
    new Thread() {
    
    public void run() {
    
    /*
    massa kod för att ändra variabler
    */
    
    nAdapter = new NewsChannelAdapter(News.this);
    
    list.setAdapter(nAdapter);
    
    progDailog.dismiss();
    
    }
    
    }.start();
    vad har jag för fel? :S får forceclose på setAdapter iaf!!

    HJÄLP?!?!? :)
     
  2. jhil

    jhil Kid Droid Medlem

    Blev medlem:
    9 jan 2010
    Inlägg:
    66
    Mottagna gillanden:
    0

    MINA ENHETER

    Vad får du för exception?

    En vanlig approach är att ha en callback i huvudtråden/programmet som din tråd anropar när den har gjort dom jobbiga beräkningarna, med resultatet som argument. I ditt fall skulle då huvudtråden stoppa in resultatet i en adapter och sätta den för listan.
     
  3. PatrikS

    PatrikS Senior Droid Medlem

    Blev medlem:
    29 jun 2009
    Inlägg:
    1 123
    Mottagna gillanden:
    65

    MINA ENHETER

  4. tomas_b

    tomas_b Kid Droid Medlem

    Blev medlem:
    23 mar 2010
    Inlägg:
    97
    Mottagna gillanden:
    4

    MINA ENHETER

    Du får inte lov att modifera vyer och sånt ifrån någon annan tråd än UI tråden, det är därför det smäller.
     
  5. alioooop

    alioooop Adult Droid Medlem

    Blev medlem:
    16 jan 2010
    Inlägg:
    720
    Mottagna gillanden:
    11

    MINA ENHETER

    joo märkte allt detta men efter lite mer research hitta jag att man ska anvädna en handler för sånt :)

    exempel
     
  6. afzkl

    afzkl Youth Droid Medlem

    Blev medlem:
    27 aug 2009
    Inlägg:
    184
    Mottagna gillanden:
    6

    MINA ENHETER

    Det lättaste är nog om du lär dig använda AsyncTask, det blir mycket smidigare or lättare och följa och du slipper ha en handler som du ska skapa meddelanden med data och sedan skicka.

    Sedan finns ju alltid runOnUiThread(new Runnable(){}) som du kan lägga in inuti din tråd för att sätta adaptern då men det är väll inte heller rekommenderat för det blir lite rörigt öm man har flera stycken på olika ställen, t.ex. vid uppdatering ab progess.
     
  7. alioooop

    alioooop Adult Droid Medlem

    Blev medlem:
    16 jan 2010
    Inlägg:
    720
    Mottagna gillanden:
    11

    MINA ENHETER

    Tack ska kolla upp de :)
     
  8. PatrikS

    PatrikS Senior Droid Medlem

    Blev medlem:
    29 jun 2009
    Inlägg:
    1 123
    Mottagna gillanden:
    65

    MINA ENHETER

    Det går att flytta en hel del kod från Activity-klassen faktiskt, jag tycker själv det blir rörigt när man når över 200-300 rader kod.
    En anledning till är om du vill slippa starta din AVD för att testa någon bakomliggande kod och unittesta utan beroenden på android-specifika api:er.

    Gör du en egen adapter-klass så går den också att flytta ut :)
     
  9. afzkl

    afzkl Youth Droid Medlem

    Blev medlem:
    27 aug 2009
    Inlägg:
    184
    Mottagna gillanden:
    6

    MINA ENHETER

    Jo visst kan man flytta ut det mesta men det kan bli rörigt att ha 50-60 klasser att namnge och hålla reda på också, särkillt om projektet växer sig stort. Jag har själv en Activity class med över 3000 rader, där finns iofs en hel del invävda klasser i den men känns ändå rätt lätt att arbeta i.
    Det är ju såklart upp till var och en vad som känns bäst, tror inte det finns några direkta rekommendationer om det. :P

    On topic:
    Jag vet inte riktigt vad det är du gör här men om du bara ska uppdatera (förnya) redan existerande data I din adapter, alltså om du redan har satt en adapter en gång och det inte är någon helt ny data du ska visa så bör du anropa:
    Kod:
    mAdapter.notifyDataSetChanged()
    
    istället, efter att du ändrat den bakomliggande datan (en Array eller vad det nu kan vara) istället för att sätta en ny adapter. Tog ett tag innan jag fattade detta, men du kanske visste det redan, tar upp det i alla fall.

    Iaf, även om du gör detta så får du inte ändra den bakomliggande datan från en annan tråd här heller, det går, men för eller senare kommer du få force close om användaren scrollar i listan samtidigt som du ändrar datan. Du kan göra dina beräkningar i en annan tråd, t.ex. hämta data från internet eller vad det nu kan vara men ändringarna skall göras från huvudtråden. Du måste också anropa notifyDataSetChanged() direkt efter att du ändrat data, detta skall också göras från UI tråden så klart.
     
  10. alioooop

    alioooop Adult Droid Medlem

    Blev medlem:
    16 jan 2010
    Inlägg:
    720
    Mottagna gillanden:
    11

    MINA ENHETER

    jag vill att den ska köra adapterns konstruktor igen o just därför jag skapar en ny, körs konstruktorn igen om man använder detta? :)
     
  11. afzkl

    afzkl Youth Droid Medlem

    Blev medlem:
    27 aug 2009
    Inlägg:
    184
    Mottagna gillanden:
    6

    MINA ENHETER

    Nej det gör den nog inte, det är mer ifall man redan har data, t.ex. om man har skrivit en rss läsare och man har chachad data som man läser in vid start och sen i bakgrounden börjar en annan tråd hämta den nyaste datan, den senaste datan hamnar längst upp men användaren är redan och läser en bit ner på den 'gamla' datan och om man kör setAdapter igen så kommer ju hela listview (eller vad det nu är för view) att resetas och användaren kommer hamna högst upp i listan ("den scollas upp)", och det blir man ju så lagom glad av om man ska behöva scolla ner igen. :P

    Ett annat exempel är en filebrowser, om användaren bestämmer sig för att byta namn på en fil så vill man inte läsa in den nya data, skapa en ny adapter och sedan sätta den på sin listview. Utan man vill istället bara updater den existerande adaptern meden man behåller Y positionen.:P
     
  12. PatrikS

    PatrikS Senior Droid Medlem

    Blev medlem:
    29 jun 2009
    Inlägg:
    1 123
    Mottagna gillanden:
    65

    MINA ENHETER

    3000 rader är väldigt svårt att överskåda...

    Det är just av den anledningen som projektet bör hållas i flera klasser om det växer sig stort med många som ska vara med och koda i det.
    Det låter ju inte direkt lätt att köra unit-tester på den koden.

    du har väl inte massa affärslogik i din activity-klass? Jag försöker hålla min fri från allt som inte har med förändring av utseende & inputs att göra. dvs "V" i MVC.

    Jag kan rekommendera Misko hevery:s blogg, han kan beskriva "avancerade" begrepp på ett grymt bra sätt :

    http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
     
    Last edited: 19 jun 2010
  13. afzkl

    afzkl Youth Droid Medlem

    Blev medlem:
    27 aug 2009
    Inlägg:
    184
    Mottagna gillanden:
    6

    MINA ENHETER

    Tack, ska ta och läsa det.

    Nu är det iofs bara jag som arbetar I detta projekt men kanske är något man skulle tänka på ändå, hade först det ganska uppdelat på många klasser men hade svårt med namnvigning och tyckte det blev rörigt att hålla reda på allt.

    Är helt outbildad inom programmering men det är kanske något man skulle titta närmare på, finns nog en hel del kod jag skulle kunna flytta ut.

    Men som t.ex. listadapter klasser och rotation dumps (objekt som man dumpar data till vid rotering av skärm för att återställa läget), bör man ha sådant i externa klasser också? Det blir ganska många om man har 15 activitys. Jag brukar lägga det i inre klasser bara.

    Men methods så som byta namn på filer, ta bort mappar och liknande bör kanske flyttas från activity klassen in i en egen klass som enkelt kan återanvändas.
     
  14. PatrikS

    PatrikS Senior Droid Medlem

    Blev medlem:
    29 jun 2009
    Inlägg:
    1 123
    Mottagna gillanden:
    65

    MINA ENHETER

    Det finns egentligen inga måsten inom programmering när det kommer till den punkten, så länge programmet rullar fint och inga buggar dyker med så är det fint på andra sidan :)
    Däremot för ens egen skull ska man hitta ett bra sätt att koda.

    En grundregel är väl (det finns undantag) att om samma kod dyker upp på flera platser så kan man flytta det till en egen metod och kanske till och med egen klass.
    Det mesta som påverkar Gui har jag låtit vara, men min ärvda listadapter har jag faktiskt flyttat ut, blev irriterad på att den låg i samma fil som min activity :d
    Sen kan jag ju återanvända den i en annan activity om jag vill :)

    Det sista du nämner kan du givetvis flytta till egna klasser, jag håller med dig om att det är svårt att komma på namn ibland.

    Du verkar för övrigt riktigt bra på utveckling för att vara "outbildad" på programmering :)
    All utbildning är utbildning, även om den sker i ensamhet :D