导入依赖
增加性能
javaCompileOptions {
arguments = [ eventBusIndex : 'com.bandeng.MyEventBusIndex' ]
compile 'com.google.code.gson:gson:2.6.1' compile 'com.youth.banner:banner:1.4.10' compile 'com.squareup.okhttp3:okhttp:3.1.2' compile 'com.squareup.okhttp3:logging-interceptor:3.9.0' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' compile 'com.facebook.fresco:fresco:1.5.0' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile 'com.hjm:BottomTabBar:1.1.1' compile 'com.github.bumptech.glide:glide:3.5.2' compile 'cn.yipianfengye.android:zxing-library:2.1' //设置权限<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.GET_TASKS" /> <!-- if you want to load images from a file OR from the internet --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 相机权限 --> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="IMAGE_CAPTURE" />
//设置布局<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="wuhao.bwei.com.wuhaosh.MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="40dp" android:background="#ff3660" android:gravity="center" android:text="商品详情" android:textColor="#ffffff" android:textSize="25sp" /> <ImageView android:id="@+id/iv" android:layout_width="match_parent" android:layout_height="400dp" /> <TextView android:id="@+id/tvBargainPrice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" /> <TextView android:id="@+id/tvPrice" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <View android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"></View> <LinearLayout android:layout_width="match_parent" android:layout_height="40dp"> <TextView android:id="@+id/tvCart" android:layout_width="0dp" android:background="#33000000" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="购物车" /> <TextView android:id="@+id/tvAddCart" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="#33000000" android:gravity="center" android:text="加入购物车" /> </LinearLayout> </LinearLayout>
View层定义一个接口public interface IMainListener { void show(DetailsBean detailsBean); void show(String str); }
net层,放入Api路径public interface Api { public static String str1 = "https://www.zhaoapi.cn/product/getProductDetail"; public static String str2 = "https://www.zhaoapi.cn/product/getCarts"; }
MyInterceptor类public class MyInterceptor implements Interceptor{ @Override public Response intercept(Chain chain) throws IOException { Request orgin=chain.request(); FormBody body= (FormBody) orgin.body(); FormBody.Builder builder=new FormBody.Builder(); for(int i=0;i<body.size();i++){ String name=body.name(i); String values=body.value(i); builder.add(name,values); } builder.add("source","android"); FormBody formBody=builder.build(); Request request=chain.request().newBuilder().url(orgin.url()).post(formBody).build(); return chain.proceed(request); } }OkHttpUtils类,封装网络get,post方法public class OkHttpUtils { private static OkHttpUtils okHttpUtils; private final OkHttpClient client; private OkHttpUtils() { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); client = new OkHttpClient.Builder() .addInterceptor(new MyInterceptor()) .build(); } public static OkHttpUtils getOkHttpUtils() { if (okHttpUtils == null) { synchronized (OkHttpUtils.class) { if (okHttpUtils == null) { okHttpUtils = new OkHttpUtils(); } } } return okHttpUtils; } /** * GET请求 * * @param url * @param callback */ public void doGet(String url, Callback callback) { Request request = new Request.Builder().url(url).build(); client.newCall(request).enqueue(callback); } /** * POST请求 * * @param url * @param params * @param callback */ public void doPost(String url, Map<String, String> params, Callback callback) { if (params == null) { throw new RuntimeException("参数为空了"); } FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } Log.e("OkHttpUtils", "请求地址:" + url + " 请求的参数:"); FormBody formBody = builder.build(); Request request = new Request.Builder().url(url).post(formBody).build(); client.newCall(request).enqueue(callback); } }
//设置范型public interface OnNetListener <T>{ public void onSuccess(T t); public void onFailure(Exception e); }
//bean包public class AddCartBean { /** * msg : 加购成功 * code : 0 */ private String msg; private String code; 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; } }
第二个bean包public class DetailsBean { /** * msg : * seller : {"description":"我是商家15","icon":"http://120.27.23.105/images/icon.png","name":"商家15","productNums":999,"score":5,"sellerid":15} * code : 0 * data : {"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","itemtype":0,"pid":71,"price":32999,"pscid":40,"salenum":4242,"sellerid":15,"subhead":"购买电脑办公部分商品满1元返火车票5元优惠券(返完即止)","title":"全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G"} */ private String msg; private SellerBean seller; private String code; private DataBean data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public SellerBean getSeller() { return seller; } public void setSeller(SellerBean seller) { this.seller = seller; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public static class SellerBean { /** * description : 我是商家15 * icon : http://120.27.23.105/images/icon.png * name : 商家15 * productNums : 999 * score : 5.0 * sellerid : 15 */ private String description; private String icon; private String name; private int productNums; private double score; private int sellerid; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getProductNums() { return productNums; } public void setProductNums(int productNums) { this.productNums = productNums; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } } public static class DataBean { /** * bargainPrice : 11800.0 * 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 * itemtype : 0 * pid : 71 * price : 32999.0 * pscid : 40 * salenum : 4242 * sellerid : 15 * subhead : 购买电脑办公部分商品满1元返火车票5元优惠券(返完即止) * title : 全球购 新款Apple MacBook Pro 苹果笔记本电脑 银色VP2新13英寸Bar i5/8G/256G */ private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private double price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } }
m层的两个接口public interface DetailsService { void getProductDetail(Map<String, String> params, OnNetListener<DetailsBean> onNetListener); }public interface AddCartService { void addCart(Map<String, String> params, OnNetListener<AddCartBean> onNetListener); }
两个类public class AddCartModel implements AddCartService { private Handler handler = new Handler(Looper.getMainLooper()); @Override public void addCart(Map<String, String> params, final OnNetListener<AddCartBean> onNetListener) { OkHttpUtils.getOkHttpUtils().doPost(Api.str1, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); final AddCartBean addCartBean = new Gson().fromJson(string, AddCartBean.class); handler.post(new Runnable() { @Override public void run() { onNetListener.onSuccess(addCartBean); } }); } }); } }
第二个类public class DetailsModel implements DetailsService { private Handler handler = new Handler(Looper.getMainLooper()); @Override public void getProductDetail(Map<String, String> params, final OnNetListener<DetailsBean> onNetListener) { OkHttpUtils.getOkHttpUtils().doPost(Api.str1, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); final DetailsBean detailsBean = new Gson().fromJson(string, DetailsBean.class); handler.post(new Runnable() { @Override public void run() { onNetListener.onSuccess(detailsBean); } }); } }); } }
p层两个类public class AddCartPresenter { private IMainListener iMainListener; private AddCartService addCartService; public AddCartPresenter(IMainListener iMainListener) { this.iMainListener = iMainListener; addCartService = new AddCartModel(); } public void dettach() { iMainListener = null; } public void addCart() { Map<String, String> params = new HashMap<>(); params.put("pid", "71"); params.put("uid", "39"); addCartService.addCart(params, new OnNetListener<AddCartBean>() { @Override public void onSuccess(AddCartBean addCartBean) { if (iMainListener != null) { iMainListener.show(addCartBean.getCode().equals("0") ? "添加成功了" : "添加失败了"); } } @Override public void onFailure(Exception e) { } }); } }
p层第二个类public class DetailsPresenter { private IMainListener iMainListener; private DetailsService detailsService; public DetailsPresenter(IMainListener iMainListener) { this.iMainListener = iMainListener; detailsService = new DetailsModel(); } public void dettach() { iMainListener = null; } public void getProductDetail() { Map<String, String> params = new HashMap<>(); params.put("pid", "71"); detailsService.getProductDetail(params, new OnNetListener<DetailsBean>() { @Override public void onSuccess(DetailsBean detailsBean) { if (iMainListener != null) { iMainListener.show(detailsBean); } } @Override public void onFailure(Exception e) { } }); } }Main方法public class MainActivity extends AppCompatActivity implements IMainListener, View.OnClickListener{ private DetailsPresenter detailsPresenter; private ImageView mIv; private TextView mTvBargainPrice; private TextView mTvPrice; /** * 购物车 */ private TextView mTvCart; /** * 加入购物车 */ private TextView mTvAddCart; private AddCartPresenter addCartPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); detailsPresenter = new DetailsPresenter(this); addCartPresenter = new AddCartPresenter(this); detailsPresenter.getProductDetail(); } @Override protected void onDestroy() { super.onDestroy(); detailsPresenter.dettach(); addCartPresenter.dettach(); } @Override public void show(DetailsBean detailsBean) { String images = detailsBean.getData().getImages(); String[] split = images.split("\\|"); Glide.with(this).load(split[0]).into(mIv); TextPaint paint = mTvBargainPrice.getPaint(); paint.setFlags(Paint.STRIKE_THRU_TEXT_FLAG); mTvBargainPrice.setText("原价:" + detailsBean.getData().getBargainPrice()); mTvPrice.setText("优惠价:" + detailsBean.getData().getPrice()); } @Override public void show(String str) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); } private void initView() { mIv = (ImageView) findViewById(R.id.iv); mTvBargainPrice = (TextView) findViewById(R.id.tvBargainPrice); mTvPrice = (TextView) findViewById(R.id.tvPrice); mTvCart = (TextView) findViewById(R.id.tvCart); mTvAddCart = (TextView) findViewById(R.id.tvAddCart); mTvCart.setOnClickListener(this); mTvAddCart.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.tvCart: Intent intent = new Intent(MainActivity.this, Main2Activity.class); startActivity(intent); break; case R.id.tvAddCart: addCartPresenter.addCart(); break; } } }