在我的 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()
(我不知道为什么。)
抱歉这么长的问题,
艾萨克沃勒