En trådfråga

Diskussion i 'Frågor, support och diskussion' startad av 112, 22 juli 2010.

  1. 112

    112 Kid Droid Medlem

    Blev medlem:
    19 juni 2010
    Inlägg:
    83
    Mottagna gillanden:
    0

    MINA ENHETER

    jag har följande klass som används från en activity:

    Kod:
    
    public class SimpleTimer extends Thread{
    
    	private int interval;
    	private SimpleTimerListener listener;
    	private boolean closed;
    
    	/**
    	 * @param interval i sekunder
    	 */
    	public SimpleTimer(int interval, SimpleTimerListener listener){
    		this.interval = interval;
    		this.listener = listener;
    	}
    	
    	public void run() {
    		closed = false;
    		while(!closed){
    			listener.doTask();	
    			try {
    				Thread.sleep(interval * 1000);
    			} catch (InterruptedException e) {}
    		}
    	}
    	
    	public void close(){
    		closed = true;
    	}
    	
    	public int getInterval() {
    		return interval;
    	}
    
    	public void setInterval(int interval) {
    		this.interval = interval;
    	}	
    }
    
    När jag startar timern så får jag följande exception:

    Kod:
    
    07-22 12:03:10.372: ERROR/AndroidRuntime(463): FATAL EXCEPTION: Thread-8
    07-22 12:03:10.372: ERROR/AndroidRuntime(463): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    07-22 12:03:10.372: ERROR/AndroidRuntime(463):     at android.os.Handler.<init>(Handler.java:121)
    07-22 12:03:10.372: ERROR/AndroidRuntime(463):     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:139)
    07-22 12:03:10.372: ERROR/AndroidRuntime(463):     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:137)
    07-22 12:03:10.372: ERROR/AndroidRuntime(463):     at android.location.LocationManager._requestLocationUpdates(LocationManager.java:708)
    07-22 12:03:10.372: ERROR/AndroidRuntime(463):     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630)
    ...
    
    Vad gör jag för fel?
     
  2. woody

    woody Teen Droid Medlem

    Blev medlem:
    3 september 2009
    Inlägg:
    319
    Mottagna gillanden:
    19

    MINA ENHETER

    Problemt ligger nog inte i den koden du lagt upp. Vad gör du i callback-metoden SimpleTimerListener.doTask()?
     
  3. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Jag håller med, problemet ligger inte i koden som visas här.

    @112. Två minor saker. closed samt interval skall deklareras som volatile.
     
  4. 112

    112 Kid Droid Medlem

    Blev medlem:
    19 juni 2010
    Inlägg:
    83
    Mottagna gillanden:
    0

    MINA ENHETER

    Ja ni har nog rätt i att felet inträffar efter det jag visade.

    doTask() finns i själva activityn och startar en ny tråd där som hämtar en gps-position

    det fungerar om jag anropar doTask() utan att anropa den från mitt SimpleTimer-objekt
     
  5. woody

    woody Teen Droid Medlem

    Blev medlem:
    3 september 2009
    Inlägg:
    319
    Mottagna gillanden:
    19

    MINA ENHETER

  6. 112

    112 Kid Droid Medlem

    Blev medlem:
    19 juni 2010
    Inlägg:
    83
    Mottagna gillanden:
    0

    MINA ENHETER

    så här ser hela stacktracet ut:

    Kod:
    
    07-22 21:22:31.292: ERROR/AndroidRuntime(623): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at android.os.Handler.<init>(Handler.java:121)
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:139)
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:137)
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at android.location.LocationManager._requestLocationUpdates(LocationManager.java:708)
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630)
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at se.ClientSide.MyLocation.getLocation(MyLocation.java:35)
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at se.ClientSide.ClientInterface.getNewLocation(ClientInterface.java:145)
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at se.ClientSide.ClientInterface.doUpdate(ClientInterface.java:132)
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at se.ClientSide.ClientInterface.doTask(ClientInterface.java:127)
    07-22 21:22:31.292: ERROR/AndroidRuntime(623):     at se.ClientSide.SimpleTimer.run(SimpleTimer.java:20)
    
    
     
  7. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Hemma har jag fulkod som nog liknar det du vill göra. Om du har en egen tråd som skall lyssna på location updates så måste det skötas via en Looper.
     
  8. 112

    112 Kid Droid Medlem

    Blev medlem:
    19 juni 2010
    Inlägg:
    83
    Mottagna gillanden:
    0

    MINA ENHETER

    dela gärna med dig :)
     
  9. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 juni 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

  10. 112

    112 Kid Droid Medlem

    Blev medlem:
    19 juni 2010
    Inlägg:
    83
    Mottagna gillanden:
    0

    MINA ENHETER

  11. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 juni 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Ah, men då funkar det ju :)
     
  12. 112

    112 Kid Droid Medlem

    Blev medlem:
    19 juni 2010
    Inlägg:
    83
    Mottagna gillanden:
    0

    MINA ENHETER

    Ja det fungerar, men inte när jag kör från min timer-klass
     
  13. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Jag postar kod (troligen under morgondagen)
     
  14. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 juni 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Vad är det du vill göra, kanske lättare att börja där? Ett alternativ är att kolla på Handler. Eller fula in ett runOnUiThread anrop från din doTask som tvingar den att köra från ui tråden.
     
  15. 112

    112 Kid Droid Medlem

    Blev medlem:
    19 juni 2010
    Inlägg:
    83
    Mottagna gillanden:
    0

    MINA ENHETER

    Det jag vill göra är att hämta en position med ett visst intervall via gps eller nätverk.

    requestLocationUpdates(provider, tid, avstånd, lyssnare);

    ska kolla lite på vad man kan göra med tid-parametern ..
     
  16. johannilsson

    johannilsson Adult Droid Medlem

    Blev medlem:
    23 juni 2009
    Inlägg:
    577
    Mottagna gillanden:
    8

    MINA ENHETER

    Om jag minns rätt så är det precis vad minTime parametern för requestLocationUpdates gör. Klassen som jag postade wrappar både gps och nätverks providern. Jag byggde den för mitt specifika case men den borde täcka det du vill göra med. Finns ingen anledning som jag ser det att sätta upp en egen timer för att anropa den i ett visst interval då detta redan sker internt i LocationManager.
     
  17. 112

    112 Kid Droid Medlem

    Blev medlem:
    19 juni 2010
    Inlägg:
    83
    Mottagna gillanden:
    0

    MINA ENHETER

    Ja det fungerade.. även om det är liiite ostabilt när den måste ta getLastKnownLocation()..

    Har en fråga till:

    Jag har en ScrollView där jag lägger till text efter hand med appendText(blabla), hur gör jag om jag vill ändra färg på texten varje gång jag anropar appendText()? ska jag göra en ny textView för varje ny text jag lägger till och använda .setTextColor()? jag försökte med det men det fungerade inte..


    07-23 13:44:35.433: ERROR/AndroidRuntime(934): Caused by: java.lang.IllegalStateException: ScrollView can host only one direct child
     
  18. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Ok. Då behöver jag inte posta min kod :)

    Använd en Spannable istället för en String när du lägger till text. En Spannable kan innehålla information om hur texten skall rendreras. Färg, font osv.
     
  19. Kaj

    Kaj Senior Droid Medlem

    Blev medlem:
    12 juni 2009
    Inlägg:
    1.768
    Mottagna gillanden:
    44

    MINA ENHETER

    Något liknandes:

    Kod:
    SpannableString spannable = new SpannableString(myString);
    spannable.setSpan(new ForegroundColorSpan(0xffff0000), 0, myString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    Helt otestat

    Edit: En förtydligan. TextView.append tar CharSequence som argument, och SpannableString är en CharSequence
     
  20. 112

    112 Kid Droid Medlem

    Blev medlem:
    19 juni 2010
    Inlägg:
    83
    Mottagna gillanden:
    0

    MINA ENHETER

    Funkade utmärkt, tackar :)