Activity重载时RecyclerView未初始化的Android开发问题求助
问题分析与解决方案
核心问题
重新进入Activity后,蓝牙消息未触发RecyclerView初始化,本质是旧Handler残留导致新Activity接收不到消息,或蓝牙已连接时未主动触发数据请求,同时数据集合未清空也会干扰流程。
解决方案步骤
1. 清理旧Handler,避免内存泄漏与消息错位
在Activity销毁时,移除Handler的所有消息和回调,确保旧Activity的Handler不再占用资源,新Activity的Handler能正常接收消息:
override fun onDestroy() { super.onDestroy() bluetoothHandler.removeCallbacksAndMessages(null) // 若你的SendReceive类有设置Handler的方法,同时解绑旧Handler sendReceive?.setHandler(null) }
2. 重新进入时主动触发数据请求
重新进入Activity时,蓝牙可能已处于连接状态,不会再走BLUETOOTH_STATE_CONNECTED分支发送请求。在onResume中检查连接状态,主动发送数据请求:
override fun onResume() { super.onResume() // 替换成你实际的蓝牙连接状态判断逻辑 if (sendReceive != null && GlobalVariables.isBluetoothConnected) { val jsonObjectToSend = JSONObject() jsonObjectToSend.put("busAddr", "") jsonObjectToSend.put("receiveRequest", jsonDataRequest) jsonObjectToSend.put("stroke", noStrokeInJson) val jsonString = jsonObjectToSend.toString() val jsonByteArray = jsonString.toByteArray(StandardCharsets.UTF_8) sendReceive.write(jsonByteArray) } }
3. 清空旧数据集合
每次进入Activity时,清空存储总线地址的集合和相关临时数据,避免旧数据干扰:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_activity_layout) // 清空旧数据 actuatorBusAddrSet.clear() jsonObject = null hubName = null // 其他初始化操作... }
4. 优化RecyclerView初始化逻辑
将RecyclerView和Adapter设为Activity成员变量,避免重复创建,仅更新数据即可:
// 定义成员变量 private lateinit var recyclerView: RecyclerView private lateinit var itemAdapter: AddActuatorRecyclerViewAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.your_activity_layout) // 初始化RecyclerView基础配置 recyclerView = findViewById(R.id.recycler_view_add_actuator) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.setHasFixedSize(true) // 初始化空Adapter itemAdapter = AddActuatorRecyclerViewAdapter(this, mutableSetOf()) recyclerView.adapter = itemAdapter // 其他初始化... } // 替换原recyclerViewInitialization方法,改为更新数据 fun updateRecyclerView() { itemAdapter.updateData(actuatorBusAddrSet) itemAdapter.notifyDataSetChanged() }
对应的Adapter需添加数据更新方法:
class AddActuatorRecyclerViewAdapter( private val context: Context, private var dataSet: MutableSet<String> ) : RecyclerView.Adapter<AddActuatorRecyclerViewAdapter.ViewHolder>() { // 添加数据更新方法 fun updateData(newData: Set<String>) { dataSet.clear() dataSet.addAll(newData) } // 原Adapter的其他代码... }
最后在BLUETOOTH_STATE_MESSAGE_RECEIVED分支中,调用updateRecyclerView()替代原recyclerViewInitialization()即可。
内容的提问来源于stack exchange,提问作者shayan
相关产品推荐
相关产品推荐

