2009-05-20 12 views
0

In meiner Android-Anwendung habe ich eine ListActivity. Diese ListActivity verwendet einen SimpleAdapter, den ich mit Elementen aus meinem Service fülle. Also, in meinem Code, ich mache:Android Loading Listview Artikel aus Service Ergebnisse in Hang

MySuperCoolService.Binder serviceBinder = null; 
private ServiceConnection serviceConnection = new ServiceConnection() 
    { 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      Log.d(TAG, "Service connection: connected!"); 
      serviceBinder = (MySuperCoolService.Binder)service; 
     } 
     public void onServiceDisconnected(ComponentName className) { 
      Log.d(TAG, "Service connection: disconnected"); 
      serviceBinder = null; 
     } 
    }; 
bindService(new Intent(this, MySuperCoolService.class), serviceConnection, BIND_AUTO_CREATE); 
while(serviceBinder==null) { 
    Thread.Sleep(1000); 
} 
// now retrieve from service using binder and set list adapter 

Dieser ganze Vorgang dauert kaum Zeit (weniger als eine Sekunde), so möchte ich es in dem UI-Thread ausgeführt werden. Siehe meine onCreate:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    fillDataUsingCodeAbove(); 
} 

Der Grund, warum ich dies in dem UI-Thread ausgeführt werden soll, ist, dass, wenn Sie ein Listenelement ausgewählt haben, oder Sie haben zu einer bestimmten Position in der Listview gescrollt, und Sie drehen das Gerät oder Entfernen Sie die Tastatur oder etwas (um eine Konfigurationsänderung auszulösen), wenn meine Aktivität neu gestartet wird, versucht Android, den Status direkt nach onCreate wiederherzustellen. Aber, wenn ich es in einem separaten Thread ausführe, wird es nicht. Es gibt auch eine coole Fadein-Animation :)
Das Problem, das ich mit der Ausführung im UI-Thread habe, ist, dass, wenn ich versuche, an den Dienst zu binden, diese Dienstbindungsanforderung in die Nachrichtenwarteschlange gestellt wird. Aber dann, wenn ich in meine Schleife gehe, stoppe ich die Nachrichtenwarteschlange vom Schleifen. Daher hängt sich mein Programm, weil es darauf wartet, dass der Dienst gebunden wird, und der Dienst wird nicht gebunden, bis die Schleife beendet wird. Ich habe gedacht Looper.loop() in meiner Schleife setzen, aber das hängt es nur an Looper.loop() (ich weiß nicht, warum.)
Sorry für eine so lange Frage,
Isaac Wallere

Antwort

0

Ich denke, dass Sie AsyncTask verwenden sollten Es wird keinen UI-Thread finden und wäre nicht viel komplizierter als das, was Sie bereits haben.

Verwandte Themen