实战retrofit
来源:互联网 发布:金蝶房地产软件 编辑:程序博客网 时间:2024/06/08 07:18
retrofit 是一个类型安全的 REST 客户端,用于 Android 平台。
上次项目因为时间关系并没有来得及用上retrofit这个据说比volley(因为我之前项目是用的volley)更快捷的。这周翻看了网上一些资料学习了,并总结了一下。
首先,配置。方法在as添加,就不细说了。(retrofit 2.0)
接下来就看使用方法 (ApiService)
@POST("login") Call<LoginResult> getLogin(@Query("phone") String phone, @Query("password") String password);
@POST是请求方法。里面包含的则是对应的接口。Call方法里面是返回的数据。@Query 是添加查询 。
Retrofit的Annotation包含请求方法相关的@GET、@POST、@HEAD、@PUT、@DELETA、@PATCH,和参数相关的@Path、@Field、@Multipart等。
注意:@GET 等请求不要以/开头;@Url: 可以定义完整url,不要以 / 开头。
然后是一个总的用法。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
LoginService loginService = retrofit.create(LoginService.class);
这里的baseUrl是接口前缀。addConverterFactory(GsonConverterFactory.create(gson))是转换器,提供Gson支持,可以添加多种序列化Factory,但是GsonConverterFactory必须放在最后,否则会抛出异常。 然后到2.0移除了Converter,所以需要自己插入一个Converter 不然的话Retrofit 只能接收字符串结果。同样的,2.0也不再依赖于Gson。2.0之后网络请求可以取消。
Call loginResultCall = loginService.getLogin(phone,password);
taskListsResultCall.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()) {
Log.e(“h”, “成功” + response.body());
}
}@Override
public void onFailure(Call call, Throwable t) {
Log.e(“h”, “失败”);
}
});
当然如果想要实现拦截器和超时设置就需要依赖okhttp。以下是我写的一个调用类。写的并不好,不喜勿喷。
import com.app.spire.BuildConfig;import com.app.spire.network.url.ApiUrl;import java.io.IOException;import java.util.concurrent.TimeUnit;import okhttp3.Headers;import okhttp3.HttpUrl;import okhttp3.Interceptor;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;import okhttp3.logging.HttpLoggingInterceptor;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory;/** * Created by huyin on 16/7/10. */public class AppClient { public static Retrofit retrofit = null; public static Retrofit retrofit() { if (retrofit == null) { OkHttpClient.Builder builder = new OkHttpClient.Builder(); /** * 公共参数 */ Interceptor addQueryParameterInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Request request = null; String method = originalRequest.method(); Headers headers = originalRequest.headers(); HttpUrl modifiedUrl = originalRequest.url().newBuilder() .addQueryParameter("参数1", "") .addQueryParameter("参数2", "") .build(); request = originalRequest.newBuilder().url(modifiedUrl).build(); return chain.proceed(request); } }; builder.addInterceptor(addQueryParameterInterceptor); /** * Log信息拦截器 */ if (BuildConfig.DEBUG) { // Log信息拦截器 HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //设置 Debug Log 模式 builder.addInterceptor(loggingInterceptor); } /** * 设置超时和重连 */ //设置超时 builder.connectTimeout(10, TimeUnit.SECONDS); builder.readTimeout(10, TimeUnit.SECONDS); builder.writeTimeout(10, TimeUnit.SECONDS);// builder.retryOnConnectionFailure(true);//错误重连 OkHttpClient okHttpClient = builder.build(); retrofit = new Retrofit.Builder() .baseUrl(ApiUrl.getHeadUrl()) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create())//转换器 .build(); } return retrofit; }}
import com.app.spire.network.result.BaseResult;
import com.app.spire.util.ActivityUtils;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Created by huyin on 16/7/10.
*/
public class BaseRequest {
private Call mCall;
public BaseRequest( Call call) { mCall = call;}//异步请求public void handleResponse(final ResponseListener listener) { mCall.enqueue(new Callback<T>() { @Override public void onResponse(Call<T> call, Response<T> response) { if (response.raw().code() == 200) {//200是服务器有合理响应 if (response.isSuccessful() && response.errorBody() == null) { listener.onSuccess(response.body()); } else { listener.onFail(); } } else {//失败响应 onFailure(call, new RuntimeException("response error,detail = " + response.raw().toString())); } } @Override public void onFailure(Call<T> call, Throwable t) { if (t instanceof SocketTimeoutException) { ActivityUtils.toast("连接超时!"); } else if (t instanceof ConnectException) { ActivityUtils.toast("网络出错"); } else if (t instanceof RuntimeException) { } } });}// 取消public void cancel(){ mCall.cancel();}public interface ResponseListener<T> { void onSuccess(BaseResult t); void onFail();}
}
未完待续…
- 实战retrofit
- RxJava+Retrofit+OkHttp实战
- MVP+Retrofit+Rxjava实战
- Android Mvp+Rxjava+Retrofit实战
- RxJava与Retrofit实战总结
- Android Mvp+RxJava+Retrofit 实战
- Retrofit在项目中的实战应用
- Retrofit+RxJava实战日志(2)-基本使用
- Dragger2与MVP与Retrofit实战
- Retrofit实战(一)一个简单的示例
- rxjava+Retrofit+okhttp 实战网络请求
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- Retrofit
- csu 1774 慷慨的奖励[双向链表]
- UVALive 4636 B - Cubist Artwork
- Linux下EasyPanel版本安装及升级
- Chromium分发输入事件给WebKit处理的过程分析
- extern 用法总结
- 实战retrofit
- 通过源代码认识Context的作用
- B树、B+树与B*树简介
- handler机制详解
- 从B树、B+树、B*树谈到R 树
- MultiAutoCompleteTextView的学习
- git学习三——打发布标签(tag)
- 111
- extern "C"用法总结