1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Wie programmiere ich eine sich peridisch aktualisierende Liste?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von arga8361, 07.02.2010.

  1. arga8361, 07.02.2010 #1
    arga8361

    arga8361 Threadstarter Neuer Benutzer

    Beiträge:
    4
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2010
    Hallo zusammen

    Noch ein Neuling - aber nicht weniger enthusiastisch ;-)

    Ich versuche Folgendes:

    1. Eine initial leere List<String>
    2. Periodisch (z.B. alle 2 Minuten) ein Element hinzufügen
    3. Bei jedem Hinzufügen soll der Andriod-Listview aktualisiert werden


    Und hier meine Fragen:

    a) Wie füge ich periodisch im Hintergrund alle 2 Minuten ein Element hinzu?
    b) Wie sorge ich dafür, dass der View aktualisiert wird?

    Vielen Dank für jede Hilfe im Voraus.
    aka
     
  2. swordi, 07.02.2010 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    a) timer
    b) adapter

    guck dir diese sachen an, dann hast du alles was du brauchst
     
    arga8361 bedankt sich.
  3. Zonnex, 07.02.2010 #3
    Zonnex

    Zonnex Fortgeschrittenes Mitglied

    Beiträge:
    431
    Erhaltene Danke:
    49
    Registriert seit:
    12.09.2009
    Kannst du beides über ne Thread-Klasse lösen.

    Code:
     class MeinThread extends Thread
        {    	
        	public void run()
        	{    		
        		while(_run)
        		{
        			try
        			{
                                    _view.extendList(); // eigene Methode die das neue Item hinzufügt
       				_view.postInvalidate(); // View updaten
          			        _thread.sleep(/* Zeit in ms */); // Pause
        			}
        					
        			} catch (InterruptedException e) {}
        		}
        	}
        }   
    
    Und die ganze Klasse dann als Objekt hinzufügen:

    Code:
    private MeinThread _thread = new MeinThread();
    _thread.start();
    
    Link's zum Thema:
    - Using threads and ProgressDialog | Hello Android
    - Simple GoogleMaps with Threads :: anddev.org - Android Development Community | Android Tutorials
    - das beispiel Programm LunarLander aus der SDK anschauen

    mfg
     
    arga8361 bedankt sich.
  4. arga8361, 07.02.2010 #4
    arga8361

    arga8361 Threadstarter Neuer Benutzer

    Beiträge:
    4
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2010
    Hi

    Besten Dank für die Antwort.

    Was jetzt klappt ist Folgendes (übrigens: Wie mache ich hier schönes Java-Syntax-Highlighting mit BBcode :confused:):

    Code:
    package sas.android;
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.TextView;
    public class Android005ThreadTest extends Activity implements Runnable {
     private String message;
     private TextView tw;
     // private TextView tv;
     // private ProgressDialog pd;
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      this.tw = (TextView) findViewById(R.id.mytext);
      this.tw.setText("Hello");
      Thread thread = new Thread(this);
      thread.start();
     }
     public void run() {
      for (int i = 1; i < 100; i++) {
       try {
        Thread.sleep(800);
        this.message = "Now: " + i;
        this.handler.sendEmptyMessage(0);
       } catch (InterruptedException e) {
       }
      }
     }
     private Handler handler = new Handler() {
      @Override
      public void handleMessage(Message msg) {
       tw.setText(message);
      }
     };
    }
     
    

    Um zu modularisieren, möchte ich nun die ganze Thread-Geschichte in eine eigene Klasse packen, so wie von Dir vorgeschlagen. Allerdings verstehe ich das Folgende noch nicht:
    1. Wo ist die MeinThread-Klasse in Deinem Beispiel? In der Activity-Klasse selbst? Oder ist das eine ausgekoppelte Klasse in einer eigenen Datei?
    2. In Deinem Beispiel benutzt eine Underscore-Konvention, die ich nicht kenne (z.B. "_run"). Wo kann ich was darüber lesen?
    Meine eigenen Versuche, die Klasse zu koppeln, schlagen fehl:

    Code:
    package sas.android;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.TextView;
    public class Android005ThreadTest extends Activity {
     private String message;
     private TextView tw;
     
     private Handler handler = new Handler() {
      public String buffer;
      @Override
      public void handleMessage(Message msg) {
       tw.setText(message);
      }
     };
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      this.tw = (TextView) findViewById(R.id.mytext);
      this.tw.setText("Hello");
      MeinThread thread = new MeinThread(handler,message);
      thread.start();
     }
    }
    
    und die abgekoppelte Klasse:

    Code:
    package sas.android;
    import android.os.Handler;
    public class MeinThread extends Thread {
     private Integer i;
     private Handler handler;
     private String message;
     public MeinThread(Handler h, String message) {
      this.handler = h;
      this.message = message;
      this.i = 0;
     }
     public void run() {
      while (true) {
       try {
        this.i++;
        this.message = "Now:" + i;
        this.handler.sendEmptyMessage(0);
        sleep(200);
       } catch (InterruptedException e) {
       }
      }
     }
    }
    
    Gerade letztere ist wahrscheinlich totaler Schrott (sorry, bin halt Noob ;-) ). Mir scheint, dass das Threading zwar klappt, aber ich habe keine Ahnung, wie ich den Textview in der Activity setzten soll. Meine hilflosen Versuche seht Ihr ja oben.

    Was mache ich falsch, bzw. wie mache ich es richtig?

    Besten Dank für Eure Hilfe!

    aka
     
  5. swordi, 08.02.2010 #5
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    hmm in der überschrift steht, du willst eine liste machen und dann kommt im ganzen code keine liste vor ? irgendwie komisch denke ich ?
     
  6. arga8361, 08.02.2010 #6
    arga8361

    arga8361 Threadstarter Neuer Benutzer

    Beiträge:
    4
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2010
    Hey, gut erkannt!

    Eins nach dem anderen, wie Du siehst, benutzte ich auch noch keinen ListView. Ich will erst einmal verstehen, wie das mit dem Threading funzt, dann kommt die Liste ;-)
     
  7. swordi, 08.02.2010 #7
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    vielleicht ist aber die verbindung der beiden sachen über adapter einfacher, als das was du hier versuchst ;)
     
  8. arga8361, 08.02.2010 #8
    arga8361

    arga8361 Threadstarter Neuer Benutzer

    Beiträge:
    4
    Erhaltene Danke:
    0
    Registriert seit:
    07.02.2010
    Du, ich bin wirklich seeehr Neuling ... und für jedes Beispiel seeehr dankbar ;-) will heissen: Kannst Du ein Stück Code posten?

    Thnks
     
  9. swordi, 08.02.2010 #9
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    aja

    wenn du alle immer nach x zeitabständen etwas tun willst, dann tu es lieber mit einem handler als mit thread.sleep().
     
  10. SeraphimSerapis, 08.02.2010 #10
    SeraphimSerapis

    SeraphimSerapis Android-Guru

    Beiträge:
    3,072
    Erhaltene Danke:
    1,138
    Registriert seit:
    27.02.2009
    Auch hier wieder meine Zustimmung. Thread.sleep() verbraucht mehr Speicher im Background als ein Handler, welcher für eine regelmäßige Aktualisierung sorgt.

    Dafür sollte man natürlich sich auch genau vor Augen halten, wie ein Thread bei Java funktioniert.
     

Diese Seite empfehlen