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,如何从我的数据库更新列表视图中的选定项目?

Android OnItemClick 无法将加载的 SQL 数据库加载到列表视图中

Android sqlite数据库-如何在滚动结束时显示列表视图添加 "加载更多项目"。

Swift,将更多数据加载到表视图中会导致滚动滞后

Android - 从 mysql 数据库中查看更多旧数据(不是图像),当在列表视图中滚动底部时

单击列表视图项目时,Android youtube api可全屏加载视频