Android Loading listview items from service results in hang
- by Isaac Waller
Hello,
In my Android application, I have a ListActivity. This ListActivity uses a SimpleAdapter that I fill with items from my service. So, in my code, I do:
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
This whole operation takes hardly any time (less than a second), so I want it to run in the UI thread. See my onCreate:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fillDataUsingCodeAbove();
}
The reason I want this to run in the UI thread is that if you have a list item selected, or you have scrolled to a certain position in the ListView, and you rotate the device or take out the keyboard or something (to trigger a configuration change) when my activity is restarted, Android will try to restore the state right after onCreate. But, if I run it in a separate thread, it will not. Also there is a cool fadein animation too :)
The problem I am having with running it in the UI thread is that when I try to bind to the service, that service bind request gets put onto the message queue. But then when I go into my loop, I stop the message queue from looping. So my program hangs, because it's waiting for the service to get bound, and the service won't get bound until the loop ends. I have thought of putting Looper.loop() inside my loop, but that just hangs it at Looper.loop() (I don't know why.)
Sorry for such a long question,
Isaac Waller