Android 从服务加载列表视图项目导致挂起
Posted
技术标签:
【中文标题】Android 从服务加载列表视图项目导致挂起【英文标题】:Android Loading listview items from service results in hang 【发布时间】:2010-10-27 12:06:17 【问题描述】:在我的 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()
(我不知道为什么。)
抱歉问了这么长的问题,
艾萨克·沃勒
【问题讨论】:
您可以使用AsyncTask 或者使用Retrofit for android. 的好方法 【参考方案1】:我认为你应该使用AsyncTask,它不会定位 UI 线程,也不会比你已有的复杂得多。
【讨论】:
以上是关于Android 从服务加载列表视图项目导致挂起的主要内容,如果未能解决你的问题,请参考以下文章
Android OnItemClick 无法将加载的 SQL 数据库加载到列表视图中
Android sqlite数据库-如何在滚动结束时显示列表视图添加 "加载更多项目"。