¿Qué se debe considerar para encapsular eficientemente una solicitud de red?

Para encapsular de manera eficiente una solicitud de red, se deben considerar los siguientes aspectos:

  1. Encapsula el objeto de solicitud de red, incluido el método de solicitud, los parámetros de solicitud, los encabezados de solicitud, la URL y otra información.
  2. Encapsula las devoluciones de llamadas de resultados de solicitudes de red, incluido el éxito de la solicitud, el error de la solicitud, el error de la solicitud y otros métodos de devolución de llamada de resultados.
  3. El procesamiento simultáneo de solicitudes de red debe admitir múltiples solicitudes al mismo tiempo.
  4. Los parámetros de las solicitudes GET y POST se encapsulan de manera diferente y deben adaptarse a diferentes tipos de solicitudes.
  5. El procesamiento de reintento de solicitudes de red debería poder reintentar automáticamente el mecanismo cuando falla la solicitud.
  6. Para el procesamiento de caché de solicitudes de red, se puede agregar un mecanismo de caché a ciertas solicitudes para reducir la cantidad de solicitudes.

Una biblioteca de solicitudes de red avanzada y eficiente debe considerar integralmente los puntos anteriores para lograr un alto grado de encapsulación y optimización de las solicitudes de red, a fin de facilitar el trabajo de desarrollo posterior. Ya existen en el mercado algunas bibliotecas de solicitudes de red excelentes para elegir, como OkHttp, Retrofit, etc. Por supuesto, también puede desarrollar su propia biblioteca de solicitudes de red según sus necesidades específicas.

OkHttp y Retrofit son bibliotecas de solicitudes de red de uso común en Android. En el proceso de usarlos para realizar solicitudes de red, se puede realizar una encapsulación avanzada y eficiente para lograr la reutilización del código y la optimización del rendimiento. Específicamente:

  1. Configuración de red unificada: la configuración de red unificada se puede realizar en la Aplicación, como tiempo de espera, información del encabezado de solicitud, etc. Esto permite que las solicitudes de red muestren un alto grado de estabilidad y coherencia en toda la aplicación.

  2. Encapsule la interfaz de devolución de llamada: encapsule los datos devueltos después del final de la solicitud de red en una interfaz de devolución de llamada, evitando la necesidad de restablecer la interfaz de devolución de llamada para cada solicitud. Al mismo tiempo, el tipo de datos devuelto por la solicitud de red se puede especificar como una clase de entidad específica mediante restricciones genéricas.

  3. Encapsule el método público de solicitudes de red: encapsule varios tipos de solicitudes de red (GET, POST, etc.) y solicite parámetros en un método público para evitar la escritura repetida de códigos similares. Además, la configurabilidad de los parámetros de solicitud se puede lograr a través del modo Constructor.

  4. Mecanismo de manejo de excepciones: maneje diferentes tipos de errores por separado, como errores de conexión de red, errores de análisis de datos, etc. La captura y el procesamiento de excepciones se pueden lograr personalizando las clases de excepción y los interceptores.

  5. Mecanismo de almacenamiento en caché: el caché de disco y el caché de memoria se pueden configurar de acuerdo con las necesidades reales para evitar solicitudes repetidas y reducir la cantidad de solicitudes de red.

Los métodos de encapsulación anteriores pueden mejorar en gran medida la reutilización y el mantenimiento del código de las solicitudes de red, y también pueden mejorar la velocidad de respuesta y la experiencia del usuario de las aplicaciones.

Por ejemplo, encapsulación OkHttp

public class OkHttpManager {
    private static OkHttpManager mInstance;
    private OkHttpClient mOkHttpClient;

    private OkHttpManager() {
        mOkHttpClient = new OkHttpClient.Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(30, TimeUnit.SECONDS)
                .build();
    }

    public static OkHttpManager getInstance() {
        if (mInstance == null) {
            synchronized (OkHttpManager.class) {
                if (mInstance == null) {
                    mInstance = new OkHttpManager();
                }
            }
        }
        return mInstance;
    }

    public void asyncGet(String url, Map<String, String> params, Callback callback) {
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        Call call = mOkHttpClient.newCall(request);
        call.enqueue(callback);
    }

    public void asyncPost(String url, Map<String, String> params, Callback callback) {
        FormBody.Builder builder = new FormBody.Builder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            builder.add(entry.getKey(), entry.getValue());
        }
        Request request = new Request.Builder()
                .url(url)
                .post(builder.build())
                .build();
        Call call = mOkHttpClient.newCall(request);
        call.enqueue(callback);
    }
}

Entre ellos, definimos un objeto singleton OkHttpClient, a través del cual se realiza la gestión de solicitudes de red. Aquí definimos dos métodos de solicitud de red: asyncGet y asyncPost representan solicitudes asincrónicas GET y POST respectivamente. Al invocar la solicitud de red anterior, solo necesitamos proporcionar la URL y los parámetros de la solicitud y la función de devolución de llamada. El objeto Callback aquí es la interfaz de devolución de llamada incorporada de OkHttp, que se utiliza para procesar el resultado de la solicitud de red. Puede elegir diferentes funciones de devolución de llamada para procesar los resultados de la solicitud según sus necesidades.

La siguiente es la implementación del paquete de Retrofit.

public class RetrofitManager {

    private static RetrofitManager mInstance;
    private Retrofit mRetrofit;

    private RetrofitManager() {
        mRetrofit = new Retrofit.Builder()
                .baseUrl(ApiService.BASE_URL)
                .client(OkHttpManager.getInstance().getOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

    public static RetrofitManager getInstance() {
        if (mInstance == null) {
            synchronized (RetrofitManager.class) {
                if (mInstance == null) {
                    mInstance = new RetrofitManager();
                }
            }
        }
        return mInstance;
    }

    public ApiService getApiService() {
        return mRetrofit.create(ApiService.class);
    }

    public static void reset() {
        mInstance = null;
    }
}

En la implementación del paquete de Retrofit, también definimos un objeto singleton para gestionar las solicitudes de Retrofit. Cabe señalar aquí que dado que Retrofit implementa solicitudes de red basadas en OkHttp, debemos pasar el objeto OkHttpClient al objeto Builder de Retrofit. Además, aquí utilizamos Gson como herramienta de análisis, lo que requiere agregar la declaración GsonConverterFactory.create() a la declaración de Retrofit Builder.

La encapsulación de Retrofit en el código es definir una interfaz ApiService para completar diferentes solicitudes de red de acuerdo con diferentes métodos de interfaz. Por ejemplo:

public interface ApiService {

    String BASE_URL = "https://api.example.com/";

    @GET("user/{id}")
    Call<User> getUser(@Path("id") String userId);

    @FormUrlEncoded
    @POST("user/edit")
    Call<Result> updateUser(@FieldMap Map<String, String> params);
}

Cuando usamos Retrofit, solo necesitamos llamar al método getApiService () de RetrofitManager para obtener el objeto ApiService y luego usar los diversos métodos de interfaz declarados en él, sin prestar atención al proceso de implementación de la solicitud de red subyacente.

En cuanto a la implementación del mecanismo de caché, el caché del disco se puede implementar a través del interceptor, y el tamaño del caché y el período de tiempo de espera se pueden configurar en OkHttpClient. Además, el almacenamiento en caché de memoria se puede implementar mediante tecnologías de almacenamiento en caché como LruCache. Esta parte del contenido es más complicada y se puede implementar según las necesidades reales.

Supongo que te gusta

Origin blog.csdn.net/ck3345143/article/details/130357806
Recomendado
Clasificación