안 드 로 이 드 개발: Retrofit + Rxjava + mvp 고급 통합
첫째, 우선 서버 가 우리 에 게 되 돌려 준 데이터 형식 json 의 형식 을 보 겠 습 니 다. 이것 은 자신 이 간단하게 쓴 배경 인터페이스 입 니 다.
{"code":66,
"message":" ",
"data":[{"id":3,"phone":"123","password":"nian","idCard":"2450","money":"100","name":"ni"}]}
2. 클 라 이언 트 쪽 의 데이터 분석 류 는 주로 사용자 류 데 이 터 를 분석 합 니 다.
public class User {
private int id;
private String phone;
private String password;
private String idCard;
private String money;
private String name;
public User(int id, String phone, String password, String idCard, String money, String name) {
this.id = id;
this.phone = phone;
this.password = password;
this.idCard = idCard;
this.money = money;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
}
3. 제 이 슨 해석 류 를 정의 합 니 다. 제 가 쓴 배경 에서 돌아 오 는 데이터 형식 은 각각 code, message, data [] 입 니 다. 서로 다른 요청 을 편리 하 게 하기 위해 저 는 data 를 일반적인 형식 으로 정의 합 니 다. 예 를 들 어 사용자 류 가 user 에 들 어가 고 댓 글 류 가 comment 에 들 어 갑 니 다.
public class ResultData {
private int code;
private String message;
private T[] data;
public T[] getData() {
return data;
}
public void setData(T[] data) {
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
4. UserHttp 클래스 가 사용자 클래스 의 요청 과 데 이 터 를 되 돌려 달라 고 요청 하 는 처 리 를 정의 합 니 다. 다른 데이터 형식의 요청 을 처리 하려 면 User 를 처리 할 데이터 형식 으로 바 꾸 면 됩 니 다. UserHttp 는 MVP 의 P 기능 으로 인터페이스 HttpResult 인 터 페 이 스 를 C 와 P 의 상호작용 으로 정의 합 니 다.
public class UserHttp implements GetInfo>{
private HttpResult httpResult;
public UserHttp(HttpResult httpResult) {
this.httpResult = httpResult;
}
/**
*
* @param user
*/
public void CallReg(User user) {
RxJavaRetrofitTool> rxJavaRetrofitTool=new RxJavaRetrofitTool<>(this);
Observable> observable1;
observable1 = rxJavaRetrofitTool.getRequestInterface().getCallReg
(user.getPhone(), user.getPassword(), user.getIdCard(), user.getMoney(), user.getName());
// demo(observable1);
rxJavaRetrofitTool.GetHttpResult(observable1);
}
/**
*
* @param phone
* @param password
*/
public void CallLogin(String phone,String password) {
RxJavaRetrofitTool> rxJavaRetrofitTool=new RxJavaRetrofitTool<>(this);
Observable> observable1;
observable1 = rxJavaRetrofitTool.getRequestInterface().getCallLogin(phone,password);
// demo(observable1);
rxJavaRetrofitTool.GetHttpResult(observable1);
}
/**
* http
* @param objects ResultData
*/
@Override
public void Data(ResultData objects) {
//
if(objects.getCode()!= Constant.CODE_ERROR)
// activity, user list,
httpResult.success(Arrays.asList(objects.getData()));
//
else httpResult.error(Constant.DATA_NULL);
}
/**
*
*/
@Override
public void Error() {
// activity
httpResult.error(Constant.OPERATION_ERROR);
}
}
HttpResult. 자바, 같은 범 형 을 정의 하여 서로 다른 데이터 형식 으로 공용 하기에 편리 합 니 다.
public interface HttpResult {
void success(List list);//
void error(String code);//
}
5. 다음은 MVP 의 M 층 처리 입 니 다. 저 희 는 Retrofit 라 는 프레임 워 크 를 사용 하여 하나의 인 터 페 이 스 를 요청 인터페이스 실현 류 로 정의 합 니 다. Retrofit 는 주 해 를 사용 하 는 방식 이 매우 편리 합 니 다.
public interface GetRequestInterface {
/**
*
*
* @param phone
* @param password
* @param idCard
* @param money
* @param name
* @return json
*/
@GET("register?")
Observable> getCallReg(@Query("phone") String phone,
@Query("password") String password,
@Query("idCard") String idCard,
@Query("money") String money,
@Query("name") String name);
@GET("login?")
Observable> getCallLogin(@Query("phone") String phone,
@Query("password") String password);
}
요청 처리 클래스 RxJavaRetrofitTool 은 같은 범 형 입 니 다. 사용 자 는 요청 이 필요 한 Observable 클래스 와 되 돌아 오 는 데이터 형식 만 입력 하면 됩 니 다.
import android.util.Log;
import com.andrem.gute.hotel.info.Constant;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RxJavaRetrofitTool {
private GetInfo getInfo;
public RxJavaRetrofitTool(GetInfo getInfo) {
this.getInfo = getInfo;
}
public GetRequestInterface getRequestInterface(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.URL) // Url
.addConverterFactory(GsonConverterFactory.create()) // Gson ( )
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // RxJava
.build();
// 2:
return retrofit.create(GetRequestInterface.class);
}
public void GetHttpResult(Observable observable1) {
// 1: Retrofit
// 3: Observable<...> 2
//observable1 = request.getCall();
observable1.subscribeOn(Schedulers.io()) // ( ) IO 1
.observeOn(AndroidSchedulers.mainThread()) // ( ) 1
.subscribe(new Consumer() {
@Override
public void accept(T resultData) throws Exception {
// Log.e("ABD", "accept: " + resultData.getMessage());
//getInfo.Data(Arrays.asList(resultData.getData()));
getInfo.Data(resultData);
}
}, new Consumer() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.d("ABD", "accept: " + " ");
getInfo.Error();
}
});
}
}
인터페이스 GetInfo 를 정의 하여 M 과 P 층 의 데이터 상호작용 에 사용 하고 똑 같이 범 형 을 정의 하여 서로 다른 데이터 유형 이 공용 하기에 편리 합 니 다.
public interface GetInfo {
void Data(T objects);//
void Error();//
}
6. 위 에 P 와 M 층 이 적 혀 있 고 아래 는 C 층 의 호출 입 니 다. 포장 을 잘 하면 간단 합 니 다.
// , phone password
new UserHttp(new HttpResult() {
@Override
public void success(List list) {
showSnackbar(v," ");
}
@Override
public void error(String code) {
showSnackbar(v," :"+code);
}
}).CallLogin(phone,passwords);
결론: 이번 학습 을 통 해 MVP 의 지식 을 많이 배 웠 고 Retrofit 와 Rxjava 프레임 워 크 의 사용 을 알 게 되 었 습 니 다. 수익 이 많 습 니 다.문제: UserHttp 클래스 는 user 클래스 만 처리 할 수 있 습 니 다. 다른 데이터 형식 을 처리 하려 면 다른 클래스 를 정의 하여 처리 해 야 합 니 다.서로 다른 데이터 형식의 네트워크 요청 을 처리 하기 위해 하나의 클래스 로 통합 하 는 방법 을 찾 을 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.