es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo limitar la velocidad de los mismos mensajes en Logcat?

Necesito registrar cosas importantes de la aplicación de Android utilizando la clase Log. Principalmente uso los tipos debug, info y error. Mi problema es que algunos registros se imprimen con bastante frecuencia en el Logcat, por ejemplo, el estado del GPS, la escucha del espacio libre del teléfono, etc. Para la aplicación, este intervalo entre algunas actualizaciones es crucial y no se puede cambiar, pero no necesito tantas líneas repetitivas en el Logcat.

Mis objetivos son:

  • Si es la primera vez que se muestra un mensaje, imprimirlo tal cual.
  • Si el mensaje ha ocurrido anteriormente, comprobar si ha pasado el intervalo de tiempo definido. Si no ha pasado, ignorar el registro.

He creado la clase LogData:

data class LogData(
    val message: String,
    val type: LogType
)

donde el tipo es:

enum class LogType {
    DEBUG,
    INFO,
    ERR
}

Me pregunto si es posible utilizar RxJava para esto y algún operador throttle, pero no sé exactamente cómo tener en cuenta el mismo mensaje y ignorarlo:

log.throttleFirst(GAP_IN_MS, TimeUnit.MILLISECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { (message, type) ->
        when(type) {
            LogType.DEBUG -> debugMessage(message)
            LogType.INFO -> infoMessage(message)
            LogType.ERR -> errorMessage(message)
        }
    }

donde private val log = BehaviorSubject.create<logdata>().

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Android, Kotlin, registro de actividades (logging) y RxJava, recomiendo la siguiente solución para los requisitos mencionados.

    Para lograr el objetivo de registrar cosas importantes en una aplicación de Android sin tener que imprimir registros repetitivos, puedes utilizar la biblioteca RxJava. El operador throttleFirst se puede usar para registrar solo cosas importantes después de que haya pasado un período definido.

    En primer lugar, crea una clase LogData que contenga el mensaje y el tipo de registro. La clase enum LogType se utiliza para definir el tipo de registro, que incluye DEBUG, INFO y ERR.

    data class LogData(
        val message: String,
        val type: LogType
    )
    
    enum class LogType {
        DEBUG,
        INFO,
        ERR
    }
    

    A continuación, crea un BehaviorSubject que contendrá los registros. El BehaviorSubject se utiliza para almacenar el valor más reciente y emitirlo a los suscriptores cuando se suscriben.

    private val log = BehaviorSubject.create<logdata>()
    

    Luego, utiliza el operador throttleFirst con el intervalo definido en milisegundos y el TimeUnit para registrar solo cosas importantes después de que haya pasado un período definido. El operador throttleFirst solo emitirá el primer elemento emitido por el Observable fuente durante una ventana de tiempo especificada.

    log.throttleFirst(GAP_IN_MS, TimeUnit.MILLISECONDS)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe { (message, type) ->
            when(type) {
                LogType.DEBUG -> debugMessage(message)
                LogType.INFO -> infoMessage(message)
                LogType.ERR -> errorMessage(message)
            }
        }
    

    Por último, en la función de registro, verifica si el mensaje ha ocurrido anteriormente y si ha pasado el intervalo de tiempo definido.

    fun logData(logData: LogData) {
        if (isGapPassed(logData)) {
            log.onNext(logData)
        }
    }
    
    fun isGapPassed(logData: LogData): Boolean {
        return log.value == null || logData.message != log.value!!.message ||
                (logData.message == log.value!!.message &&
                        logData.type != log.value!!.type) ||
                (logData.message == log.value!!.message &&
                        logData.type == log.value!!.type &&
                        System.currentTimeMillis() - logTimestamp > GAP_IN_MS)
    }
    

    Este enfoque registrará mensajes importantes a medida que ocurren, y evitará duplicados o registros repetitivos dentro del intervalo definido.

Comments are closed.