我需要从后台线程访问listview的适配器

Posted

技术标签:

【中文标题】我需要从后台线程访问listview的适配器【英文标题】:I need to access adapter of listview from a background thread 【发布时间】:2020-04-18 13:17:01 【问题描述】:

我正在开发一个聊天应用程序,正如标题所说,我想从后台线程访问 adapterListView 以向其中添加新元素(消息)而不创建新的 ListView 和适配器实例因为这会导致刷新ListView 并在用户观看底部的最后一条消息时再次向上滚动,如果我尝试从我的聊天活动中将我的适配器设置为static,它会告诉我它可能会导致内存泄漏,因为适配器正在使用上下文。

1- 有没有办法通过从我的后台线程创建一个新实例来更新ListView 适配器,而无需在更新或删除我之前的ListView 消息时滚动回第一个?

2- 如果不是,那么如果我尝试在适配器中使用getApplicationContext() 以免导致泄漏,它会正常工作吗?因为从这个主题我读到应用程序上下文不会膨胀布局 https://www.aurigait.com/blog/Best+practices-of-appropriate-Context-in-android/

【问题讨论】:

为什么不切换回主线程?例如View.post(Runnable) 我实际上是这样做的,因为我必须这样做才能访问 UI 元素并将 Chat.adapter.add() 调用放入其中,但正如您所见,适配器是静态的。 【参考方案1】:

为什么不将 RecyclerView 与 ListAdapter 一起使用?

https://developer.android.com/reference/androidx/recyclerview/widget/ListAdapter

【讨论】:

【参考方案2】:

我想到了一个使用静态适配器的想法,并在它被销毁时从我的聊天活动中删除它的引用,这样它就不会导致泄漏。

【讨论】:

以上是关于我需要从后台线程访问listview的适配器的主要内容,如果未能解决你的问题,请参考以下文章

Android:在 ListView 中移动项目的窗口?

从后台线程访问 [UIApplication sharedApplication] 可以吗?

Android,ListView IllegalStateException:“适配器的内容已更改但ListView没有收到通知”

在从主线程访问后,不得从后台线程对 > 布局引擎进行修改

找出从后台线程访问的 winforms 控件

Android:线程从网络加载数据后更新Listview