You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:05:56