Retrofit retrofit = new Retrofit
.Builder()
.baseUrl(ApiUtils.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
public interface UserMgrService {
/**
* GET 用 Query
*/
@GET("login")
Call login(@Query("username") String username, @Query("password") String password);
}
UserMgrService service = retrofit.create(UserMgrService.class);
Call call = service.login( mAccountEdit.getText().toString(), mPasswordEdit.getText().toString());
Response response = call.execute();
Log.d("123123", "msg--" + response.body().getUser_head_img());
//回调
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
Log.d("123123", "msg--" + response.body().getUser_head_img());
}
@Override
public void onFailure(Call call, Throwable t) {
// 失败时做处理
}
});
Retrofit 和 LiveData 结合的⼀种实现⽅法
具体实现
class LiveDataCallAdapterFactory : CallAdapter.Factory() {
override fun get(
returnType: Type,
annotations: Array,
retrofit: Retrofit
): CallAdapter<*, *>? {
if (getRawType(returnType) != LiveData::class.java) return null
//获取第一个泛型类型
val observableType = getParameterUpperBound(0, returnType as ParameterizedType)
return LiveDataCallAdapter(observableType)
}
}
class LiveDataCallAdapter(private val responseType: Type):CallAdapter>{
override fun responseType(): Type {
return responseType
}
override fun adapt(call: Call): LiveData {
return object : LiveData() {
private val started = AtomicBoolean(false)
override fun onActive() {
super.onActive()
if (started.compareAndSet(false, true)) {//确保执行一次
call.enqueue(object : Callback {
override fun onFailure(call: Call, t: Throwable) {
postValue(null)
}
override fun onResponse(call: Call, response: Response) {
postValue(response.body())
}
})
}
}
}
}
}
private void initRetrofit() {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
//1、初始话OKhttp
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS) //设置请求超市时间
.readTimeout(60,TimeUnit.SECONDS) //设置读取超时时间
.writeTimeout(60,TimeUnit.SECONDS) //设置写入超时时间
.retryOnConnectionFailure(true) //设置出现错误时重连
.addInterceptor(new HeadIntercept())
.addInterceptor(loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY))
.build();
//2、初始化retrofitl
retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(Constants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(new Gson()))
.addCallAdapterFactory(new LiveDataCallAdapterFactory())
.build();
}
public interface UserMgrServiceLiveData {
//post 传body
@POST("api/medical/applogin")
LiveData login(@Body UserBean body);
}
UserBean userBean= new UserBean();
userBean.setIdcard(userName);
userBean.setPassword(pwd);
apiService.login(userBean).observe((LifecycleOwner) context, new Observer() {
@Override
public void onChanged(UserNewsBean userNewsBeanApiResponse) {
Log.e( "onChanged: ",userNewsBeanApiResponse.toString());
}
});
完成上边就可以使用liveData+retrofit进行网络请求了
但是,这并不是它的最终形态。
如果我们后台返回的接口是统一的格式:
例如是:
{
data:[],//或者{}
errorCode:0,
errorMsg:""
}
那么我们可以定义已个统一的处理类
class ApiResponse (
var data: T?,
var errorCode: Int,
var errorMsg:String
)
然后在我们的CallAdapterFactory类中做响应的调整如下即添加
val rawType = getRawType(observableType)
if (rawType != ApiResponse::class.java) {
throw IllegalArgumentException(“type must be ApiResponse”)
}
if (observableType !is ParameterizedType) {
throw IllegalArgumentException(“resource must be parameterized”)
}
这些代码
class LiveDataCallAdapterFactory : CallAdapter.Factory() {
override fun get(
returnType: Type,
annotations: Array,
retrofit: Retrofit
): CallAdapter<*, *>? {
if (getRawType(returnType) != LiveData::class.java) return null
//获取第一个泛型类型
val observableType = getParameterUpperBound(0, returnType as ParameterizedType)
val rawType = getRawType(observableType)
if (rawType != ApiResponse::class.java) {
throw IllegalArgumentException("type must be ApiResponse")
}
if (observableType !is ParameterizedType) {
throw IllegalArgumentException("resource must be parameterized")
}
return LiveDataCallAdapter(observableType)
}
}
最后调整我们的请求接口类如下
public interface UserMgrServiceLiveData {
//post 传body
@POST("api/medical/applogin")
LiveData> login(@Body UserBean body);
}
调用方式不变