Rxjava+Retrofit+GreenDao+RecyclerView实现数据存储数据库

http包

记录状态的类

public class CommonUtil {
    private static SharedPreferences mShared;
    private static void getSharedPreference(){
        if (mShared==null){
            mShared= MyApplication.getContext().getSharedPreferences("mShared", Context.MODE_PRIVATE);
        }
    }
    public static void setStringValue(String key,String value){
        getSharedPreference();
        mShared.edit().putString(key,value).commit();
    }
    public static void setBooleanValue(String key,boolean value){
        getSharedPreference();
        mShared.edit().putBoolean(key,value).commit();
    }
    public static String getStringValue(String key){
        getSharedPreference();
        return mShared.getString(key,"");
    }
    public static boolean getBoooleanValue(String key){
        getSharedPreference();
        return mShared.getBoolean(key,false);
    }
}

接口类

public class HttpConfig {

    public static String base_url = "http://120.27.23.105/product/";
    public static String getCart = "getCarts";
}

网络请求类

public class HttpRetrofitUtil {
    //单例模式
    private static HttpRetrofitUtil httpRetrofitUtil;
    private final Retrofit retrofit;

    public static HttpRetrofitUtil getIntance(String baseUrl) {
        if (httpRetrofitUtil == null) {
            httpRetrofitUtil = new HttpRetrofitUtil(baseUrl);
        }
        return httpRetrofitUtil;
    }

    public HttpRetrofitUtil(String baseUrl) {
        OkHttpClient okHttpclient = new OkHttpClient.Builder()
                //.addInterceptor(new MyIntercepter())
                .build();
        retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create(new Gson()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpclient)
                .build();
    }

    //指定服务的方法
    public <T> T createRequest(Class<T> clz) {
        T t = retrofit.create(clz);
        return t;
    }

    //拦截器添加公共参数
    class MyIntercepter implements Interceptor {

        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            RequestBody body = request.body();
            if (body instanceof FormBody) {
                FormBody.Builder builder = new FormBody.Builder();
                for (int i = 0; i < ((FormBody) body).size(); i++) {
                    String name = ((FormBody) body).name(i);
                    String value = ((FormBody) body).value(i);
                    builder.add(name, value);
                }
                builder.add("source", "android");
                FormBody formBody = builder.build();
                Request newrequest = request.newBuilder().post(formBody).build();
                Log.e("url", newrequest.url().toString());

                Response proceed = chain.proceed(newrequest);
                return proceed;
            }
            return null;
        }
    }
}

初始化数据库帮助类

public class MyApplication extends Application {
    private static MyApplication instances;
    private static Context context;
    private DaoMaster.DevOpenHelper mHelper;
    private DaoMaster mDaoMaster;
    private SQLiteDatabase db;
    private DaoSession mDaoSession;



    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
        setDatabase();
        instances=this;
        context=this;
    }

    private void setDatabase() {
        mHelper = new DaoMaster.DevOpenHelper(this, "exam", null);
        db = mHelper.getWritableDatabase();
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }
    public static MyApplication getInstances(){
        return instances;
    }
    public static Context getContext(){
        return context;
    }
    public DaoSession getmDaoSession(){
        return mDaoSession;
    }
}

视图view类

public interface IManView {
    void showCartGoods( String json);

    void showError(String error);


}

Activity类

public class MainActivity extends AppCompatActivity implements IManView {
    private static final String TAG = "MainActivity=====";
    private RecyclerView recycler;
    private MiniBeanDao miniBeanDao;
    private PresenterImpl presenter;
    private TextView clear;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recycler = findViewById(R.id.recycler);
        clear = findViewById(R.id.clear);
        recycler.setLayoutManager(new LinearLayoutManager(this));
        miniBeanDao = MyApplication.getInstances().getmDaoSession().getMiniBeanDao();

        /**
         * 根据数据库有没有数据来判断是否加载数据库中数据
         */
        // 查询数据库
        List<MiniBean> miniBeans = miniBeanDao.loadAll();
        Log.e("Size",miniBeans.size()+"");
        if (miniBeans != null && miniBeans.size() > 0) {         //如果数据库有数据就使用数据库的数据
            recycler.setAdapter(new MyAdapter(this, miniBeans));
            Log.e("hhaha",miniBeans.get(0).getTitle());
        } else {
            //数据没有数据就网络请求
            HashMap<String, String> map = new HashMap<>();
            map.put("uid", "12290");
            map.put("source", "android");
            presenter = new PresenterImpl(this);
            presenter.showCartToView(HttpConfig.getCart, map);

        }

        // 清空数据库
        clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                miniBeanDao.deleteAll();
            }
        });
    }


    @Override
    public void showCartGoods(String json) {
        /**
         * 每次请求的时候 表示数据库没有数据 需要向数据库填数据
         */
        ArrayList<MiniBean> newList = new ArrayList<>();
        CartBean cartBean = new Gson().fromJson(json, CartBean.class);
        Log.e("json", json);
        if (cartBean != null && cartBean.getData().size() > 0) {
            //  Log.e("size", cartBean.getData().size() + "");
            //遍历数据将数据保存到集合中
            for (int i = 0; i < cartBean.getData().size(); i++) {
                List<MiniBean> list = cartBean.getData().get(i).getList();
                newList.addAll(list);
            }
            //将数据保存到数据库
            for (int i = 0; i < newList.size(); i++) {
                miniBeanDao.insert(newList.get(i));
            }
            recycler.setAdapter(new MyAdapter(this, newList));
        }
    }

    @Override
    public void showError(String error) {
        Log.d(TAG, "MainActivity++=+" + error);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (presenter != null) {
            presenter.unScribe();
            presenter = null;
        }
    }
}

适配器类

public class MyAdapter extends RecyclerView.Adapter <MyAdapter.MyViewHolder>{
    private Context context;
    private  List<MiniBean> list;

    public MyAdapter(Context context, List<MiniBean> list) {
        this.context = context;
       this.list=list;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = View.inflate(context, R.layout.recyclerview_item, null);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        SimpleDraweeView image = holder.getImage();
        MiniBean listBean = list.get(position);
        String imagurl = listBean.getImages().split("\\|")[0];
        image.setImageURI(imagurl);
        holder.getTitle().setText(listBean.getTitle());


    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{

        private final SimpleDraweeView image;
        private final TextView state;
        private final TextView title;
        private final TextView time;

        public MyViewHolder(View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.my_image_view);
            state = itemView.findViewById(R.id.recycler_state);
            title = itemView.findViewById(R.id.recycler_title);
            time = itemView.findViewById(R.id.recycler_time);
        }

        public SimpleDraweeView getImage() {
            return image;
        }

        public TextView getState() {
            return state;
        }

        public TextView getTitle() {
            return title;
        }

        public TextView getTime() {
            return time;
        }
    }
}

model层

bean类

public class CartBean {
    /**
     * msg : 请求成功
     * code : 0
     * data : [{"list":[{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/5025518.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t8830/106/1760940277/195595/5cf9412f/59bf2ef5N5ab7dc16.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5428/70/1520969931/274676/b644dd0d/591128e7Nd2f70da0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5566/365/1519564203/36911/620c750c/591128eaN54ac3363.jpg!q70.jpg","num":1,"pid":58,"price":6399,"pscid":40,"selected":0,"sellerid":2,"subhead":"升级4G大显存!Nvme协议Pcie SSD,速度快人一步】GTX1050Ti就选拯救者!专业游戏键盘&新模具全新设计!","title":"联想(Lenovo)拯救者R720 15.6英寸游戏笔记本电脑(i5-7300HQ 8G 1T+128G SSD GTX1050Ti 4G IPS 黑)"}],"sellerName":"商家2","sellerid":"2"},{"list":[{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://mitem.jd.hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","num":1,"pid":61,"price":14999,"pscid":40,"selected":0,"sellerid":5,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家5","sellerid":"5"},{"list":[{"bargainPrice":11800,"createtime":"2017-10-03T23:53:28","detailUrl":"https://mitem.jd.hk/ware/view.action?wareId=1988853309&cachekey=1acb07a701ece8d2434a6ae7fa6870a1","images":"https://m.360buyimg.com/n0/jfs/t6130/97/1370670410/180682/1109582a/593276b1Nd81fe723.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5698/110/2617517836/202970/c9388feb/593276b7Nbd94ef1f.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5815/178/2614671118/51656/7f52d137/593276c7N107b725a.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5878/60/2557817477/30873/4502b606/593276caN5a7d6357.jpg!q70.jpg","num":1,"pid":62,"price":15999,"pscid":40,"selected":0,"sellerid":6,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"}],"sellerName":"商家6","sellerid":"6"}]
     */

    private String msg;
    private String code;
    private List<DataBean> data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * list : [{"bargainPrice":11800,"createtime":"2017-10-14T21:38:26","detailUrl":"https://item.m.jd.com/product/5025518.html?utm#_source=androidapp&utm#_medium=appshare&utm#_campaign=t#_335139774&utm#_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t8830/106/1760940277/195595/5cf9412f/59bf2ef5N5ab7dc16.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5428/70/1520969931/274676/b644dd0d/591128e7Nd2f70da0.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5566/365/1519564203/36911/620c750c/591128eaN54ac3363.jpg!q70.jpg","num":1,"pid":58,"price":6399,"pscid":40,"selected":0,"sellerid":2,"subhead":"升级4G大显存!Nvme协议Pcie SSD,速度快人一步】GTX1050Ti就选拯救者!专业游戏键盘&新模具全新设计!","title":"联想(Lenovo)拯救者R720 15.6英寸游戏笔记本电脑(i5-7300HQ 8G 1T+128G SSD GTX1050Ti 4G IPS 黑)"}]
         * sellerName : 商家2
         * sellerid : 2
         */

        private String sellerName;
        private String sellerid;
        private List<MiniBean> list;

        public String getSellerName() {
            return sellerName;
        }

        public void setSellerName(String sellerName) {
            this.sellerName = sellerName;
        }

        public String getSellerid() {
            return sellerid;
        }

        public void setSellerid(String sellerid) {
            this.sellerid = sellerid;
        }

        public List<MiniBean> getList() {
            return list;
        }

        public void setList(List<MiniBean> list) {
            this.list = list;
        }


    }
}
@Entity
public class MiniBean {
    @Id(autoincrement = true)
    private Long id;
    private double bargainPrice;
    private String createtime;
    private String detailUrl;
    private String images;
    private int num;
    private int pid;
    private double price;
    private int pscid;
    private int selected;
    private  int sellerid;
    private String subhead;
    private String title;
    public String getTitle() {
        return this.title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getSubhead() {
        return this.subhead;
    }
    public void setSubhead(String subhead) {
        this.subhead = subhead;
    }
    public int getSellerid() {
        return this.sellerid;
    }
    public void setSellerid(int sellerid) {
        this.sellerid = sellerid;
    }
    public int getSelected() {
        return this.selected;
    }
    public void setSelected(int selected) {
        this.selected = selected;
    }
    public int getPscid() {
        return this.pscid;
    }
    public void setPscid(int pscid) {
        this.pscid = pscid;
    }
    public double getPrice() {
        return this.price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public int getPid() {
        return this.pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public int getNum() {
        return this.num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String getImages() {
        return this.images;
    }
    public void setImages(String images) {
        this.images = images;
    }
    public String getDetailUrl() {
        return this.detailUrl;
    }
    public void setDetailUrl(String detailUrl) {
        this.detailUrl = detailUrl;
    }
    public String getCreatetime() {
        return this.createtime;
    }
    public void setCreatetime(String createtime) {
        this.createtime = createtime;
    }
    public double getBargainPrice() {
        return this.bargainPrice;
    }
    public void setBargainPrice(double bargainPrice) {
        this.bargainPrice = bargainPrice;
    }
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    @Generated(hash = 1823845415)
    public MiniBean(Long id, double bargainPrice, String createtime,
            String detailUrl, String images, int num, int pid, double price,
            int pscid, int selected, int sellerid, String subhead, String title) {
        this.id = id;
        this.bargainPrice = bargainPrice;
        this.createtime = createtime;
        this.detailUrl = detailUrl;
        this.images = images;
        this.num = num;
        this.pid = pid;
        this.price = price;
        this.pscid = pscid;
        this.selected = selected;
        this.sellerid = sellerid;
        this.subhead = subhead;
        this.title = title;
    }
    @Generated(hash = 1947519766)
    public MiniBean() {
    }
   
    
}
Model接口类
public interface IModel {
    void getCartGoods(String url,Map<String,String> map);
    void unScribe();
}
Model实现类
public class ModelImpl implements IModel {
    private IPresenter iPresenter;
    private Disposable disposable;

    public ModelImpl(IPresenter iPresenter) {
        this.iPresenter = iPresenter;
    }


    @Override
    public void getCartGoods(String url, Map<String, String> map) {
       HttpRetrofitUtil.getIntance(HttpConfig.base_url).createRequest(MyService.class).doPost(url,map)

               .subscribeOn(Schedulers.newThread())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(new Observer<ResponseBody>() {

                   @Override
                   public void onError(Throwable e) {
                        iPresenter.failure(e);
                   }

                   @Override
                   public void onComplete() {

                   }

                   @Override
                   public void onSubscribe(Disposable d) {
                       disposable =d;
                   }

                   @Override
                   public void onNext(ResponseBody responseBody) {
                       try {
                           String json = responseBody.string();
                           iPresenter.succeed(json);
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }
               });

    }

    @Override
    public void unScribe() {
        disposable.dispose();
    }
}

服务类

public interface MyService {
    @GET("{url}")
    Observable<ResponseBody> doGet(@Path(value = "url",encoded = true) String url, @QueryMap Map<String,String> map);

    @FormUrlEncoded
    @POST("{url}")
    Observable<ResponseBody> doPost(@Path(value = "url",encoded = true) String url, @FieldMap Map<String,String>map);
}

释放内存类

public abstract class BasePresenter<T> {
    private Reference<T> mView;
    protected void attach(T view){
        mView=new WeakReference<T>(view);
    }
    protected boolean isAttached(){
        return mView!=null && mView.get()!=null;
    }
    protected void unAttach(){
        if (isAttached()){
            mView.clear();
            mView=null;
        }
    }
}

p层接口类

public interface IPresenter {
    void showCartToView(String url, Map<String,String> map);
  void succeed(String json);
  void failure(Throwable e);
        void unScribe();
}

p层实现类

public class PresenterImpl extends BasePresenter implements IPresenter {
    private IManView iManView;
    private IModel iModel;

    public PresenterImpl(IManView iManView) {
        this.iManView = iManView;
        this.iModel = new ModelImpl(this);
        attach(iManView);
    }

    @Override
    public void showCartToView(String url, Map<String, String> map) {
            iModel.getCartGoods(url,map);
    }

    @Override
    public void succeed(String json) {
        iManView.showCartGoods(json);
    }

    @Override
    public void failure(Throwable e) {
        iManView.showError(e.getMessage());
    }

    @Override
    public void unScribe() {
        iModel.unScribe();
        unAttach();
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值