0

在我的 Android 应用程序中,我有一个 ListActivity。这个 ListActivity 使用了一个 SimpleAdapter,我用我的服务中的项目填充了它。所以,在我的代码中,我这样做:

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

整个操作几乎不需要任何时间(不到一秒),所以我希望它在 UI 线程中运行。请参阅我的 onCreate:

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

我希望它在 UI 线程中运行的原因是,如果您选择了一个列表项,或者您已经滚动到 ListView 中的某个位置,并且您旋转设备或取出键盘或其他东西(触发配置更改)当我的活动重新启动时,Android 将尝试在 onCreate 之后立即恢复状态。但是,如果我在单独的线程中运行它,它不会。还有一个很酷的淡入淡出动画 :)
我在 UI 线程中运行它时遇到的问题是,当我尝试绑定到服务时,该服务绑定请求被放入消息队列中。但是当我进入我的循环时,我停止了消息队列的循环。所以我的程序挂起,因为它正在等待服务被绑定,并且服务在循环结束之前不会被绑定。我想过放Looper.loop()在我的循环中,但这只是挂在Looper.loop()(我不知道为什么。)
抱歉这么长的问题,
艾萨克沃勒

4

1 回答 1

0

我认为你应该使用AsyncTask,它不会定位 UI 线程,也不会比你已经拥有的复杂得多。

于 2010-06-09T20:29:16.093 回答