Android封装网络请求
在现代Android开发中,网络请求是不可或缺的一部分,为了提高代码的可维护性和复用性,封装一个高效的网络请求框架显得尤为重要,本文将详细介绍如何在Android项目中封装网络请求,主要使用OkHttp和Retrofit这两个流行的网络请求库。
二、选择合适的网络请求库
1、Volley:由Google开发,适用于简单的网络请求,易于使用且性能卓越。
2、OkHttp:高性能HTTP客户端,支持同步和异步请求,具备连接池和缓存策略。
3、Retrofit:基于OkHttp的网络请求库,通过注解定义接口,简化了HTTP请求的编写。
4、其他库:如Android-Async-Http等,也具备特定场景下的优势。
三、封装OkHttp实例
我们需要创建一个单例模式的OkHttpClientUtil类,以便在整个应用程序中复用同一个OkHttp实例。
public class OkHttpClientUtil { private static volatile OkHttpClientUtil okHttpUtil; private boolean mIsIntercept = true; private long mReadTimeOut = 20000; private long mConnectTimeOut = 20000; private long mWriteTimeOut = 20000; private OkHttpClientUtil() { } public static OkHttpClientUtil getInstance() { if (okHttpUtil == null) { synchronized (OkHttpClientUtil.class) { if (okHttpUtil == null) { okHttpUtil = new OkHttpClientUtil(); } } } return okHttpUtil; } public OkHttpClient build() { return new OkHttpClient.Builder() .readTimeout(mReadTimeOut, TimeUnit.MILLISECONDS) .connectTimeout(mConnectTimeOut, TimeUnit.MILLISECONDS) .writeTimeout(mWriteTimeOut, TimeUnit.MILLISECONDS) .build(); } // Getter and Setter methods... }
四、封装OkHttp拦截器
为了方便调试和监控网络请求,我们可以添加一个拦截器来打印请求和响应信息。
public class HttpRequestInterceptor implements Interceptor { @NotNull @Override public Response intercept(@NotNull Chain chain) throws IOException { Request request = chain.request(); long startTime = System.currentTimeMillis(); okhttp3.Response response = chain.proceed(request); long endTime = System.currentTimeMillis(); long duration = endTime startTime; okhttp3.MediaType mediaType = response.body().contentType(); String content = response.body().string(); Log.d("request", "请求地址:| " + request.toString()); if (request.body() != null) { printParams(request.body()); } Log.d("request", "请求体返回:| Response:" + content); Log.d("request", "--请求耗时:" + duration + "毫秒"); return response; } }
五、封装Retrofit实例
Retrofit通过注解方式定义网络请求接口,极大地简化了代码编写,我们可以通过创建一个单例模式的RetrofitClient类来管理Retrofit实例。
public class RetrofitClient { private static RetrofitClient instance; private Retrofit retrofit; private RetrofitClient() { retrofit = new Retrofit.Builder() .client(getOkHttpClient()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl("http://你的服务器地址") .build(); } public static RetrofitClient getInstance() { if (instance == null) { synchronized (RetrofitClient.class) { if (instance == null) { instance = new RetrofitClient(); } } } return instance; } private OkHttpClient getOkHttpClient() { return new OkHttpClient.Builder() .connectTimeout(120, TimeUnit.SECONDS) .readTimeout(120, TimeUnit.SECONDS) .writeTimeout(120, TimeUnit.SECONDS) .connectionPool(new ConnectionPool(8, 15, TimeUnit.SECONDS)) .addInterceptor(new HttpRequestInterceptor()) .build(); } }
六、封装Retrofit注解通用类
为了简化接口定义,我们可以封装一些常用的注解通用类。
public interface BaseApiService { @GET("api/helloworld") Call<String> getHelloWorld(); @POST("api/login") @FormUrlEncoded Call<User> login(@Field("username") String username, @Field("password") String password); }
七、增加请求失败重试功能
为了增强网络请求的健壮性,我们可以实现请求失败后的重试机制。
public class RetryInterceptor implements Interceptor { private int maxRetries; private long retryInterval; // in milliseconds private TimeUnit timeUnit; public RetryInterceptor(int maxRetries, long retryInterval, TimeUnit timeUnit) { this.maxRetries = maxRetries; this.retryInterval = retryInterval; this.timeUnit = timeUnit; } @NotNull @Override public Response intercept(@NotNull Chain chain) throws IOException { Request request = chain.request(); int tryCount = 0; while (true) { try { return chain.proceed(request); } catch (IOException e) { tryCount++; if (tryCount > maxRetries) { throw e; } else { Thread.sleep(retryInterval); } } } } }
八、封装返回结果处理
为了更好地处理网络请求的返回结果,我们可以封装一个通用的结果处理类。
public class Result<T> { private T data; private String message; private int code; public T getData() { return data; } public void setData(T data) { this.data = data; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } }
九、组装完整的网络请求框架
我们将上述各个部分组装起来,形成一个完整的网络请求框架。
public class NetworkManager { private static NetworkManager instance; private Retrofit retrofit; private OkHttpClient okHttpClient; private ProgressDialog progressDialog; private Context context; private NetworkManager(Context context) { this.context = context; this.okHttpClient = OkHttpClientUtil.getInstance().build(); this.retrofit = RetrofitClient.getInstance().getRetrofit(); this.progressDialog = new ProgressDialog(context); } public static NetworkManager getInstance(Context context) { if (instance == null) { synchronized (NetworkManager.class) { if (instance == null) { instance = new NetworkManager(context); } } } return instance; } public <T> doGet(String url, Map<String, String> params, Class<T> clazz, Callback<T> callback) { // Implementation of GET request using OkHttp or Retrofit... } public <T> doPost(String url, Map<String, String> params, Class<T> clazz, Callback<T> callback) { // Implementation of POST request using OkHttp or Retrofit... } // Other HTTP methods... }
以上就是关于“android封装网络请求”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!