Android从服务中加载listview项目会导致挂起

时间:2009-05-20 00:10:40

标签: android listview service message-queue serviceconnection

在我的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之后立即恢复状态。但是,如果我在一个单独的线程中运行它,它就不会。还有一个很酷的fadein动画:) 我在UI线程中运行它时遇到的问题是,当我尝试绑定到服务时,该服务绑定请求将被放入消息队列中。但是当我进入循环时,我会阻止消息队列循环。所以我的程序挂起,因为它正在等待服务绑定,并且在循环结束之前服务不会被绑定。我曾想过将Looper.loop()放在我的循环中,但这只是挂在Looper.loop()(我不知道为什么。)
抱歉这么长的问题,
艾萨克沃勒

1 个答案:

答案 0 :(得分:0)

我认为您应该使用AsyncTask,它不会定位UI线程,并且不会比您现有的更复杂。