4

我正在开发一个具有 MVVM 架构的聊天应用程序,我SharedFlow用来将传入的消息RepositoryViewModel. 当用户离线,另一个用户向他发送大量消息时,用户一上线,消息就会接踵而至,Repository需要传送到ViewModel用户界面中显示。我首先将extraBufferCapacity值设置为 1,然后看到在这种情况下,只有前两条消息在ViewModel. 然后我将extraBufferCapacity值增加到 6 并看到前 7 条消息被传输到ViewModel. 现在如果我将extraBufferCapacity值增加到Int.MAX_VALUE,会导致内存泄漏吗?

存储库:

object ChatRepo {
    private val _receiveMessageFlow = MutableSharedFlow<Message>(extraBufferCapacity = Int.MAX_VALUE)
    val receiveMessageFlow = _receiveMessageFlow.asSharedFlow()

    fun listen(socket: Socket) {
        socket.on(Config.ON_PV_MESSAGE, onPvMessage)
    }

    private val onPvMessage = Emitter.Listener { args ->
        val message = Gson().fromJson(args[0].toString(), Message::class.java)

        _receiveMessageFlow.tryEmit(message)
    }
}

视图模型:

class ChatViewModel(var receiver: User) : ViewModel() {
    private val _messagesLive = MutableLiveData<Resource<MessageList>>()
    val messagesLive = _messagesLive as LiveData<Resource<MessageList>>

    init {
        observeReceivedMessage()
    }

    private fun observeReceivedMessage() {
        viewModelScope.launch {
            ChatRepo.receiveMessageFlow.collect { message ->
                if (message.senderUid == receiver.uid) {
                    addMessage(message)
                }
            }
        }
    }

    private fun addMessage(message: Message) {
        val resource = _messagesLive.value ?: Resource.success(MessageList())
        val messageList = resource.data ?: MessageList()
        messageList.addMessageLast(message)
        _messagesLive.value = Resource.add(messageList, 0)
    }
}
4

1 回答 1

2

什么是维基百科的内存泄漏

在计算机科学中,内存泄漏是一种资源泄漏,当计算机程序以不释放不再需要的内存的方式错误地管理内存分配时发生。当对象存储在内存中但运行代码无法访问时,也可能发生内存泄漏。

根据您拥有的代码ChatRepo,即objectSingleton),生命ChatRepo周期是应用程序的生命周期。它有一个字段receiveMessageFlow,可以缓冲一些不被任何订阅者消费的数据。如果唯一的订阅者在ChatViewModel其中并且不再消耗由 发出的数据receiveMessageFlow,但receiveMessageFlow仍在缓冲一些数据,那么在这种情况下,我会说存在内存泄漏,因为不再需要的内存没有被释放

于 2022-02-05T13:30:22.817 回答