美文网首页
MVVM在网络中应用(OkHttp+Retrofit+Gson+

MVVM在网络中应用(OkHttp+Retrofit+Gson+

作者: 像天空的鸽子 | 来源:发表于2019-08-26 20:11 被阅读0次
    应用目录结构

    1.封装请求地址常量类

    package com.fuxun.property.config;
    
    import com.ylink.commons.entity.PosLoginInfoDto;
    
    /**
     * 全局常量
     *
     * @author twilight
     * @Time 2019-07-21
     */
    
    public class PropertyConstant {
        /**
         * 请求后台的所有API接口都在这里配置;统一管理
         */
        public static class Server {
    
            public final static String _4057 = "4057";
    
            public final static String _4060 = "4060";
    
            public final static String _4061 = "4061";
    
            public final static String _4067 = "4067";
    
            public final static String _4068 = "4068";
    
            public final static String _4069 = "4069";
        }
    
        /**
         * 全局静态变量
         */
        public static class Param {
    
        }
    
        /**
         * sp 常量
         */
        public static class SP {
    
            public static final String SP = "property_sp";//sp
        }
        /**
         * 全局常量
         */
        public static class FINALVALUE {
    
        }
    }
    

    2.封装网络工具类

    package com.fuxun.property.http;
    
    
    import android.util.Base64;
    import com.alibaba.fastjson.JSONObject;
    import com.fuxun.property.config.PropertyConstant;
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    import com.ylink.commons.config.CommonsConstant;
    import com.ylink.commons.utils.JsonUtils;
    import com.ylink.commons.utils.MD5;
    import com.ylink.https.base.BaseVo;
    import com.ylink.https.config.HttpsConstant;
    
    import java.io.File;
    import java.io.UnsupportedEncodingException;
    import java.lang.reflect.Type;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import okhttp3.MediaType;
    import okhttp3.RequestBody;
    
    
    /**
     * 工具类,把vo转换成map
     *
     * @author weishixiong
     * @Time 2018-03-19
     */
    public class HttpUtil {
    
        /**
         * vo转换为Map
         *
         * @param vo
         * @return
         */
        public static RequestBody convertVo2Json(BaseVo vo) {
            Map maps = convertVo2Params(vo);
            JSONObject object = new JSONObject(maps);
            return RequestBody.create(MediaType.parse("Content-Type, application/json"),
                    "{\"data\":" + object.toString() + "}");
        }
    
    
        /**
         * vo转换为Map
         *
         * @param vo
         * @return
         */
        public static Map<String, String> convertVo2Params(BaseVo vo) {
            Gson gson = new Gson();
            Type type = new TypeToken<Map<String, String>>() {
            }.getType();
            return gson.fromJson(gson.toJson(vo), type);
        }
    
        /**
         * 多文件转换为 Map<String, RequestBody> bodyMap
         * 多文件上传参考:https://www.jianshu.com/p/d4f77e7a4e00
         * @param files
         * @param mediaType 文件类型
         * @return
         */
        public static Map<String, RequestBody> convertVo2BodyMap(List<File> files, String mediaType) {
            Map<String, RequestBody> bodyMap = new HashMap<>();
            for (int i = 0; i < files.size(); i++) {
                bodyMap.put("file" + i + "\"; filename=\"" + files.get(i).getName(), RequestBody.create(MediaType.parse(mediaType), files.get(i)));
            }
            return bodyMap;
        }
    
        /**
         * 获取请求头
         * @return
         */
        public static Map<String, String> getHeaders(final Object bodyObj){
            Map<String, String> headers = new HashMap<>();
            headers.put(CommonsConstant.SP.AUTH, CommonsConstant.Param.TOKEN);
            headers.put(CommonsConstant.SP.STORE_ID, CommonsConstant.Param.STORE_ID);
            headers.put(CommonsConstant.SP.DEVICE_NUMBER, CommonsConstant.Param.IMEI);
            headers.put("加密密钥key", getEncryptValue(JsonUtils.jsonFormat(bodyObj), "加密密钥value")); //报文加密值
            return  headers;
        }
    
        private static String getEncryptValue(String params, String token) {
            String encryptValue;
            if (params.length() > 0) {
                encryptValue = JsonUtils.sortJson(params);
                try {
                    encryptValue = Base64.encodeToString(encryptValue.getBytes("utf-8"), Base64.DEFAULT);
                    encryptValue = encryptValue.replaceAll("\r|\n", "");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                encryptValue = MD5.md5(encryptValue + token);
            } else {
                encryptValue = MD5.md5(token);
            }
    
            return encryptValue;
        }
    }
    

    3.封装接口类

    package com.fuxun.property.http;
    
    import com.fuxun.property.config.PropertyConstant;
    import com.fuxun.property.model.dto.PosRecvInfoSyncDto;
    import com.fuxun.property.model.dto.RevokeRefundDto;
    import com.fuxun.property.model.dto.RevokeRefundPreOrderDto;
    import com.fuxun.property.model.dto.ScanCodePreOrderDto;
    import com.fuxun.property.model.dto.TransManageListDto;
    import com.fuxun.property.model.dto.TransRecordDetailDto;
    import com.fuxun.property.model.vo.PosRecvInfoSyncVo;
    import com.fuxun.property.model.vo.RevokeRefundPreOrderVo;
    import com.fuxun.property.model.vo.RevokeRefundVo;
    import com.fuxun.property.model.vo.ScanCodePreOrderVo;
    import com.fuxun.property.model.vo.TransManageListVo;
    import com.fuxun.property.model.vo.TransRecordDetailVo;
    import com.ylink.https.base.BaseDto;
    
    import java.util.Map;
    
    import io.reactivex.Flowable;
    import retrofit2.http.Body;
    import retrofit2.http.HeaderMap;
    import retrofit2.http.POST;
    
    /**
     * api接口
     *
     * @author twilight
     * @Time 2019-07-21
     *
     * retrofit的注解学习https://blog.csdn.net/qiang_xi/article/details/53959437
     */
    
    public interface ApiService {
    
        /**
         * 扫描订单码预下单
         * @param headers
         * @param scanCodePreOrderVo
         * @return
         */
        @POST(PropertyConstant.Server._4067)
        Flowable<BaseDto<ScanCodePreOrderDto>> scanCodePreOrder(@HeaderMap Map<String, String> headers,
                                                          @Body ScanCodePreOrderVo scanCodePreOrderVo);
    }
    

    4.封装DTO类——即返回的数据封装模型

    package com.fuxun.property.model.dto;
    
    import java.io.Serializable;
    
    /**
     * 物业收款预下单返回实体类
     */
    public class ScanCodePreOrderDto implements Serializable {
    
        private String userNo; //用户编号
        private String acctNo; //用户账号
        private String prdCode; //商品编号
        private String prdName; //商品信息
        private String payCurrency; //币种
        private String payAmount; //交易金额
        private String terOrderNo; //平台订单号
        private String merOrderNo; //商户订单号
    
        public String getUserNo() {
            return userNo;
        }
    
        public void setUserNo(String userNo) {
            this.userNo = userNo;
        }
    
        public String getAcctNo() {
            return acctNo;
        }
    
        public void setAcctNo(String acctNo) {
            this.acctNo = acctNo;
        }
    
        public String getPrdCode() {
            return prdCode;
        }
    
        public void setPrdCode(String prdCode) {
            this.prdCode = prdCode;
        }
    
        public String getPrdName() {
            return prdName;
        }
    
        public void setPrdName(String prdName) {
            this.prdName = prdName;
        }
    
        public String getPayCurrency() {
            return payCurrency;
        }
    
        public void setPayCurrency(String payCurrency) {
            this.payCurrency = payCurrency;
        }
    
        public String getPayAmount() {
            return payAmount;
        }
    
        public void setPayAmount(String payAmount) {
            this.payAmount = payAmount;
        }
    
        public String getTerOrderNo() {
            return terOrderNo;
        }
    
        public void setTerOrderNo(String terOrderNo) {
            this.terOrderNo = terOrderNo;
        }
    
        public String getMerOrderNo() {
            return merOrderNo;
        }
    
        public void setMerOrderNo(String merOrderNo) {
            this.merOrderNo = merOrderNo;
        }
    }
    

    5.封装请求的数据VO类

    package com.fuxun.property.model.vo;
    
    import com.ylink.https.base.BaseVo;
    
    /**
     * 物业收款预下单Vo
     */
    public class ScanCodePreOrderVo extends BaseVo {
    
        private String url; //业务订单生成URL
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    }
    

    6.数据请求仓库(接口)

    package com.fuxun.property.repository;
    
    import android.arch.lifecycle.LiveData;
    
    import com.fuxun.property.model.dto.ScanCodePreOrderDto;
    import com.fuxun.property.model.vo.ScanCodePreOrderVo;
    import com.ylink.https.base.BaseDto;
    
    /**
     * 订单码收款Repository
     */
    public interface IOrdercodeRepository {
    
        /**
         * 扫描订单码预下单
         * @param scanCodePreOrderVo
         * @return
         */
        LiveData<BaseDto<ScanCodePreOrderDto>> scanCodePreOrder(ScanCodePreOrderVo scanCodePreOrderVo);
    }
    

    6.数据请求仓库实现类

    package com.fuxun.property.repository;
    
    import android.arch.lifecycle.LiveData;
    
    import com.fuxun.property.http.ApiService;
    import com.fuxun.property.http.HttpUtil;
    import com.fuxun.property.model.dto.ScanCodePreOrderDto;
    import com.fuxun.property.model.vo.ScanCodePreOrderVo;
    import com.ylink.https.base.BaseDto;
    import com.ylink.https.base.BaseRepository;
    import com.ylink.https.http.RequetRetrofit;
    
    /**
     * 订单码收款Repository
     */
    public class OrdercodeRepository extends BaseRepository implements IOrdercodeRepository {
    
        /**
         * 扫描订单码预下单
         * @param scanCodePreOrderVo
         * @return
         */
        @Override
        public LiveData<BaseDto<ScanCodePreOrderDto>> scanCodePreOrder(ScanCodePreOrderVo scanCodePreOrderVo) {
            return request(RequetRetrofit.getInstance(ApiService.class).scanCodePreOrder(HttpUtil.getHeaders(scanCodePreOrderVo), scanCodePreOrderVo)).get();
        }
    }
    

    7.调用数据仓库的工具类

    我把packge和类的导入删掉了.
    
    /**
     * 物业收款主页viewmodel
     */
    public class HomeViewModel extends ViewModel {
    
        private HomeActivity activity;
        public void setActivity(HomeActivity activity){
            this.activity = activity;
        }
        /**
         * 扫描订单码预下单
         * @param url
         */
        public LiveData<BaseDto<ScanCodePreOrderDto>> scanCodePreOrder(final String url){
            IOrdercodeRepository ordercodeRepository = new OrdercodeRepository();
            ScanCodePreOrderVo scanCodePreOrderVo = new ScanCodePreOrderVo();
            scanCodePreOrderVo.setUrl(url);
            return ordercodeRepository.scanCodePreOrder(scanCodePreOrderVo);
        }
    }
    

    7.调用数工具类的Activity

    /**
     * 物业收款主页面
     */
    public class HomeActivity extends BasePosActivity {
    
        private CustomDlg customDlg;
        private HomeViewModel homeViewModel;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home);
        
            //注意这里初始化
            homeViewModel = ViewModelProviders.of(this).get(HomeViewModel.class);
            homeViewModel.setActivity(this);
        }
    
     /**
         * 发送订单码预下单
         * @param url
         */
        private void scanCodePreOrder(final String url){
            showLoading(true);
            //下面是真正的调用
            homeViewModel.scanCodePreOrder(url).observe(this, new Observer<BaseDto<ScanCodePreOrderDto>>() {
                @Override
                public void onChanged(@Nullable BaseDto<ScanCodePreOrderDto> scanCodePreOrderDtoBaseDto) {
                    showLoading(false);
                    if(scanCodePreOrderDtoBaseDto.getStatusCode().equals(HttpsConstant.RespCode.R000)){
                        Log.d("log", "ScanCodePreOrderDto="+ JSONObject.toJSONString(scanCodePreOrderDtoBaseDto.getData()));
                        Intent intent = new Intent(HomeActivity.this, ScanOrdercodeRecvConActivity.class);
                        intent.putExtra("scanCodePreOrderDto",scanCodePreOrderDtoBaseDto.getData());
                        startActivity(intent);
                    }else{
                        customDlg = new CustomDlg(HomeActivity.this);
                        customDlg.show();
                        customDlg.setContent(scanCodePreOrderDtoBaseDto.getStatusDesc());
                        customDlg.setCancelTxt("取消");
                        customDlg.setConfirmTxt("重新尝试");
                        customDlg.addConfirmCallbackListener(new CustomDlg.ConfirmCallbackListener() {
                            @Override
                            public void onConfirm() {
                                onOrderCodeRecv(null); //重新扫码
                            }
                        });
                        customDlg.addCancelCallbackListener(new CustomDlg.CancelCallbackListener() {
                            @Override
                            public void onCancel() {
    
                            }
                        });
                    }
                }
            });
        }
    }
    

    相关文章

      网友评论

          本文标题:MVVM在网络中应用(OkHttp+Retrofit+Gson+

          本文链接:https://www.haomeiwen.com/subject/pvadectx.html