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(); } }