> Move the "now retrieve from service using binder and set list adapter"
> into onServiceConnected() and get rid of the sleep() infinite loop.
If I do this, then I lose the benefits of running it in the UI thread.
I want to hang my application until it gets these items, because if
not, my view with id="android:empty" shows up for a second, and that
looks ugly.

> Is your service positively deterministic, such that it will *always*
> take less than a second? Or does it take less than a second only in
> normal conditions (e.g., connectivity is OK to some server you're
> fetching data from)?
The data is inside a List inside my service, already pre-made. It
should take basically no time at all.

How would I fix the deadlock?

On May 23, 5:33 pm, Mark Murphy <mmur...@commonsware.com> wrote:
> Isaac Waller wrote:
> > 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
>
> Icky!
>
> Move the "now retrieve from service using binder and set list adapter"
> into onServiceConnected() and get rid of the sleep() infinite loop.
>
> > This whole operation takes hardly any time (less than a second), so I
> > want it to run in the UI thread.
>
> Is your service positively deterministic, such that it will *always*
> take less than a second? Or does it take less than a second only in
> normal conditions (e.g., connectivity is OK to some server you're
> fetching data from)?
>
> > 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.
>
> By default, yes. There are other ways of dealing with this.
>
> > But, if I run it in a separate thread, it will not.
>
> Sure it can. Either don't reload the state from the service (by using
> onRetainNonConfigurationInstance() and having your state persist across
> rotations), or fork another background thread (if these are
> load-data-and-close threads), or tell a persistent background thread
> "yo! load the stuff again!".
>
> > 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.
>
> Correct.
>
> > But then when I go into my loop, I stop the message
> > queue from looping.
>
> Equally correct.
>
> > 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 think you call this a deadlock).
>
> Spot on! In other words, icky!
>
> > Sorry for such a long question,
>
> I seem to have missed the question.
>
> If the question is "how do I get rid of the infinite loop?", move the
> "now retrieve from service using binder and set list adapter" into
> onServiceConnected().
>
> However, unless you're really really certain this will always occur very
> very quickly, use a background thread, in addition to getting rid of the
> infinite loop.
>
> --
> Mark Murphy (a Commons 
> Guy)http://commonsware.com|http://twitter.com/commonsguy
>
> _The Busy Coder's Guide to Android Development_ Version 2.0 Available!
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to