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 optimizar este método de solicitud HTTP para evitar bloqueos en el hilo de la interfaz de usuario?

Cuando ejecuto este método, en Flutter, por ejemplo cuando hago onTap en el detector de gestos, Flutter se congela dos veces, cuando se invoca el método get (creo que es por el convertidor json de Dio, tal vez, no lo sé) y cuando se invoca el método base64Decode.

En Flutter web, cuando se invoca el método get, Flutter se congela por completo (el onSendProgress tampoco funciona en este momento) y después de esto, la aplicación en Chrome se bloquea con el código 5, después de un minuto, o tal vez dos -_-.

context no es BuildContext.

httpClient es el cliente HTTP de Dio.

transformOf verifica si el resultado de la solicitud es un error, y si es así, transforma el resultado de la solicitud en mis excepciones personalizadas de Flutter y luego las lanza, de lo contrario, devuelve el resultado de la solicitud.

El tamaño del resultado de la solicitud es de 20-50mb.

Future<uint8list> readBookFile(Identificator groupId, Identificator bookId) async {
  final result = await context.httpClient.get(
    '/book/file',
    queryParameters: {
      'groupId': groupId.toString(),
      'bookId': bookId.toString(),
    },
  ).transformOf(context);

  return base64Decode(result['bookBytes']);
}

¿Cómo optimizar este código para evitar las congelaciones?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para optimizar este código y deshacerse de los bloqueos, puede probar las siguientes soluciones:

    1. Utilice la palabra clave await al invocar el método get para asegurarse de que el método se complete antes de continuar.
    2. Utilice bloques try y catch para manejar cualquier error que pueda ocurrir durante la solicitud de la API y la conversión de datos.
    3. Considere utilizar técnicas de carga de datos asíncrona y caché para optimizar el manejo de conjuntos de datos grandes.

    Aquí hay un ejemplo de código optimizado:

    Future<uint8list> leerArchivoLibro(Identificador groupId, Identificador bookId) async {
        try {
          final resultado = await context.httpClient.get(
            '/libro/archivo',
            queryParameters: {
              'groupId': groupId.toString(),
              'bookId': bookId.toString(),
            },
          ).transformOf(context);
    
          return base64Decode(resultado['bookBytes']);
        } catch (error) {
          // maneja cualquier error que pueda ocurrir durante la solicitud de la API y la conversión de datos
          print('Error: $error');
          return null;
        }
    }
    

    Al implementar las soluciones anteriores, puede optimizar su código para deshacerse de los bloqueos y mejorar el rendimiento general de su aplicación.

Comments are closed.