안 드 로 이 드 개발: Retrofit + Rxjava + mvp 고급 통합

9171 단어
최근 에 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 클래스 만 처리 할 수 있 습 니 다. 다른 데이터 형식 을 처리 하려 면 다른 클래스 를 정의 하여 처리 해 야 합 니 다.서로 다른 데이터 형식의 네트워크 요청 을 처리 하기 위해 하나의 클래스 로 통합 하 는 방법 을 찾 을 수 없습니다.

좋은 웹페이지 즐겨찾기