MVP+OKHttp获取网络数据

来源:互联网 发布:sql server2012破解版 编辑:程序博客网 时间:2024/06/05 23:00


要导入的一些依赖

 compile files('libs/universal-image-loader-1.9.3.jar')
    compile files('libs/okio-1.13.0.jar')
    compile files('libs/okhttp-3.9.0.jar')
    compile files('libs/gson-2.2.4.jar')
    compile 'com.jcodecraeer:xrecyclerview:1.3.2'

注意要加网络权限

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application
        android:name=".app.MyApp"

MainActivity

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;

import com.example.mvpokhttp.Bean.ShowBean;
import com.example.mvpokhttp.Presenter.showpresenter;
import com.example.mvpokhttp.View.ShowView;
import com.example.mvpokhttp.adaptera.MyAdapter;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.List;

public class MainActivity extends AppCompatActivity implements ShowView {

    private XRecyclerView mXrv;
    showpresenter sp;
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();



    }

    private void initView() {
        mXrv = (XRecyclerView) findViewById(R.id.xrv);
            sp=new showpresenter(MainActivity.this,this);
        sp.getData();
    }

    @Override
    public void shows(List<ShowBean.DataBean.GoodsBriefBean> list) {
        LinearLayoutManager ll=new LinearLayoutManager(this);
        mXrv.setLayoutManager(ll);
        adapter = new MyAdapter(MainActivity.this,list);
        mXrv.setAdapter(adapter);
    }

    @Override
    public void showAdapter(List<ShowBean.DataBean.GoodsBriefBean> list) {
        adapter.setData(list);
    }


}


Model层

import okhttp3.Callback;

 public interface ShowModel {
    public void getData(Callback callback);
}

 
 Show类继承ShowModel
import com.example.mvpokhttp.Utils.OkHttp3Utils;

import okhttp3.Callback;

public class Show implements ShowModel {

    @Override
    public void getData(Callback callback) {
   OkHttp3Utils.doGet("http://m.yunifang.com/yunifang/mobile/category/list?random=96333&encode=bf3386e14fe5bb0bcef234baebca2414",callback);
    }
}

View层

import com.example.mvpokhttp.Bean.ShowBean;

import java.util.List;

 public interface ShowView {
    public void shows(List<ShowBean.DataBean.GoodsBriefBean> list);
    public void showAdapter(List<ShowBean.DataBean.GoodsBriefBean> list);
}


presenter层

import android.content.Context;

import com.example.mvpokhttp.Bean.ShowBean;
import com.example.mvpokhttp.Model.Show;
import com.example.mvpokhttp.Model.ShowModel;
import com.example.mvpokhttp.Utils.OnUiCallback;
import com.example.mvpokhttp.View.ShowView;
import com.google.gson.Gson;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Call;

public class showpresenter {
  Context context;
    ShowView view;
    ShowModel model;
    List<ShowBean.DataBean.GoodsBriefBean> list;

    public showpresenter(Context context, ShowView view) {
        this.context = context;
        this.view = view;
        model=new Show();
        view.shows(list);
    }

    public List<ShowBean.DataBean.GoodsBriefBean> getData(){
    list=new ArrayList<ShowBean.DataBean.GoodsBriefBean>();

     model.getData(new OnUiCallback() {
         @Override
         public void onFailed(Call call, IOException e) {

         }

         @Override
         public void onSuccess(String result) throws IOException {
             Gson gson=new Gson();
             ShowBean bean = gson.fromJson(result, ShowBean.class);
             list.addAll(bean.getData().getGoodsBrief());
             view.showAdapter(list);
         }
     });

        return list;
    }
}


OkHttp的封装1

import android.os.Handler;

import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;

public class OkHttpUtils {
    private Handler handler = new Handler();
    public Handler getHandler(){
        return handler;
    }
    //单例
    private static OkHttpUtils okHttpUtils = new OkHttpUtils();
    private OkHttpUtils(){};
    public static OkHttpUtils getInstance(){
        return okHttpUtils;
    }

    private OkHttpClient client;
    //
    private  OkHttpClient getOkHttpClient() {
        synchronized (OkHttpUtils.class) {
            if (client == null) {
                client = new OkHttpClient();
            }
        }
        return client;
    }

    //公用的get请求方法  完成的功能不确定
    public void doGet(String url, Callback callback){
        OkHttpClient okHttpClient = getOkHttpClient();
        Request request = new Request.Builder().url(url).build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(callback);
    }
    
     public  void doPost(String url, Map<String,String> map, Callback callback){
         OkHttpClient okHttpClient = getOkHttpClient();
         FormBody.Builder builder = new FormBody.Builder();
        //遍历map集合   设置请求体
        for (String mapKey : map.keySet()){
           builder.add(mapKey,map.get(mapKey));
        }
        //设置请求方式
        Request request = new Request.Builder().url(url).post(builder.build()).build();
        //执行请求方式    接口回调
         okHttpClient.newCall(request).enqueue(callback);
    }
    
      /**
     *1.下载地址
     */
    public  void doDown(String url,Callback callback){
        OkHttpClient okHttpClient = getOkHttpClient();
        Request build = new Request.Builder().url(url).build();
        okHttpClient.newCall(build).enqueue(callback);
    }
}


OnUiCallback   OkHttp的封装2

import android.os.Handler;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public abstract class OnUiCallback implements Callback{
    private Handler handler = OkHttpUtils.getInstance().getHandler();
    public abstract void onFailed(Call call, IOException e);
    public abstract void onSuccess(String result) throws IOException;

    @Override
    public void onFailure(final Call call, final IOException e) {
        //该方式  存在问题  网络请求也跑到了主线程   待解决
        //该方法就是把  线程post到handler所在的线程
        handler.post(new Runnable() {
            @Override
            public void run() {
                onFailed(call, e);
            }
        });

    }

    @Override
    public void onResponse(final Call call, final Response response) throws IOException {
        final String result = response.body().string();
        //该方式  存在问题  网络请求也跑到了主线程   待解决
        handler.post(new Runnable() {
            @Override
            public void run() {
                try {
                    onSuccess(result);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

初始化ImageLoader
import android.app.Application;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

 public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ImageLoaderConfiguration cofn = ImageLoaderConfiguration.createDefault(this);
        ImageLoader.getInstance().init(cofn);
    }
}

MyAdapter适配器
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.mvpokhttp.Bean.ShowBean;
import com.example.mvpokhttp.R;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.List;

 public class MyAdapter extends XRecyclerView.Adapter<XRecyclerView.ViewHolder> {
    Context context;
    List<ShowBean.DataBean.GoodsBriefBean> list;

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

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

    @Override
    public void onBindViewHolder(XRecyclerView.ViewHolder holder, int position) {
        ((MyViewHolder)holder).tv_name.setText(list.get(position).getEfficacy());
        ImageLoader.getInstance().displayImage(list.get(position).getGoods_img(),((MyViewHolder) holder).iv);
    }

    @Override
    public int getItemCount() {
        return list!=null?list.size():0;
    }

    public void setData(List<ShowBean.DataBean.GoodsBriefBean> list) {
        this.list = list;
        notifyDataSetChanged();
    }
    public class MyViewHolder extends XRecyclerView.ViewHolder{
        TextView tv_name;
        ImageView iv;
        public MyViewHolder(View itemView) {
            super(itemView);
            tv_name=itemView.findViewById(R.id.tv_name);
           iv=itemView.findViewById(R.id.item_iv);
        }
    }
}

布局

activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.mvpokhttp.MainActivity">

    <com.jcodecraeer.xrecyclerview.XRecyclerView
        android:id="@+id/xrv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.jcodecraeer.xrecyclerview.XRecyclerView>
</RelativeLayout>

item布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     android:orientation="horizontal"
    >
    <TextView
        android:id="@+id/tv_name"
        android:textSize="10sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ImageView
        android:id="@+id/item_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>



解析的网络数据Bean

import java.util.List;

public class ShowBean {

    /**
     * code : 200
     * msg : success
     * data : {"category":[{"id":"16","cat_name":"按功效","is_leaf":"0","children":[{"id":"17","cat_name":"补水保湿","is_leaf":"1"},{"id":"31","cat_name":"舒缓修护","is_leaf":"1"},{"id":"19","cat_name":"控油去痘","is_leaf":"1"},{"id":"18","cat_name":"美白提亮","is_leaf":"1"},{"id":"20","cat_name":"紧致抗皱","is_leaf":"1"}]},{"id":"6","cat_name":"按属性","is_leaf":"0","children":[{"id":"38","cat_name":"面膜","is_leaf":"0"},{"id":"39","cat_name":"润肤水","is_leaf":"1"},{"id":"40","cat_name":"润肤乳","is_leaf":"1"},{"id":"24","cat_name":"洁面乳","is_leaf":"0"},{"id":"35","cat_name":"其他","is_leaf":"0"},{"id":"33","cat_name":"实惠套装","is_leaf":"1"},{"id":"9","cat_name":"贴式面膜","is_leaf":"0"},{"id":"10","cat_name":"睡眠面膜","is_leaf":"0"},{"id":"23","cat_name":"泥浆面膜","is_leaf":"0"},{"id":"41","cat_name":"男士","is_leaf":"0"}]},{"id":"11","cat_name":"按肤质","is_leaf":"0","children":[{"id":"14","cat_name":"混合性肤质","is_leaf":"1"},{"id":"13","cat_name":"中性肤质","is_leaf":"1"},{"id":"29","cat_name":"干性肤质","is_leaf":"1"},{"id":"28","cat_name":"油性肤质","is_leaf":"1"},{"id":"15","cat_name":"痘痘肤质","is_leaf":"1"},{"id":"37","cat_name":"敏感肤质","is_leaf":"0"}]}],"goodsBrief":[{"id":"121","goods_name":"镇店之宝丨美白嫩肤面膜7片","shop_price":49.9,"market_price":99,"goods_img":"https://image.yunifang.com/yunifang/images/goods/121/goods_img/17062610568378169043195978.jpg","reservable":false,"efficacy":"镇店之宝 美白爆款","stock_number":0,"restrict_purchase_num":0},{"id":"389","goods_name":"热销爆款丨清爽平衡矿物黑面膜21片","shop_price":99.9,"market_price":297,"goods_img":"https://image.yunifang.com/yunifang/images/goods/389/goods_img/17062610265116850439553337.jpg","reservable":false,"efficacy":"以黑吸黑 净透亮肤","stock_number":0,"restrict_purchase_num":0},{"id":"684","goods_name":"解救肌渴丨花粹水润面膜套装10片","shop_price":29.9,"market_price":139,"goods_img":"https://image.yunifang.com/yunifang/images/goods/684/goods_img/17062610401397749701177609.jpg","reservable":false,"efficacy":"水润充盈 鲜嫩少女肌","stock_number":0,"restrict_purchase_num":0},{"id":"6","goods_name":"好用不贵丨亮颜水润蚕丝面膜(寂地定制版)","shop_price":59.9,"market_price":239.9,"goods_img":"https://image.yunifang.com/yunifang/images/goods/6/goods_img/170626112597120167739086821.jpg","reservable":false,"efficacy":"深层补水 提亮肤色","stock_number":0,"restrict_purchase_num":0},{"id":"772","goods_name":"买就赠黑糖7片丨清润莹亮黑膜套装21片","shop_price":79.9,"market_price":297,"goods_img":"https://image.yunifang.com/yunifang/images/goods/772/goods_img/170929144736019579343521099.jpg","reservable":false,"efficacy":"自然莹亮  水感瓷肌","stock_number":0,"restrict_purchase_num":0},{"id":"5","goods_name":"金桂花矿物眼膜贴60片","shop_price":49.9,"market_price":89,"goods_img":"https://image.yunifang.com/yunifang/images/goods/5/goods_img/170626112553213363513709796.jpg","reservable":false,"efficacy":"补水靓眼 改善熊猫眼","stock_number":0,"restrict_purchase_num":0},{"id":"343","goods_name":"美白嫩肤润肤水150ml","shop_price":69,"market_price":119,"goods_img":"https://image.yunifang.com/yunifang/images/goods/343/goods_img/170626103423611420000294568.jpg","reservable":false,"efficacy":"补水保湿 美白嫩肤","stock_number":0,"restrict_purchase_num":0},{"id":"9","goods_name":"玫瑰滋养矿物睡眠面膜180g","shop_price":59.9,"market_price":99,"goods_img":"https://image.yunifang.com/yunifang/images/goods/9/goods_img/170626112611018894167156705.jpg","reservable":false,"efficacy":"镇店之宝 彻夜补水","stock_number":0,"restrict_purchase_num":0},{"id":"10","goods_name":"包邮丨美白嫩肤睡眠面膜180g","shop_price":49.9,"market_price":99,"goods_img":"https://image.yunifang.com/yunifang/images/goods/10/goods_img/170626112190919312919673075.jpg","reservable":false,"efficacy":"补水美白 越睡越白","stock_number":0,"restrict_purchase_num":0},{"id":"446","goods_name":"芦荟补水保湿凝胶150g","shop_price":49.9,"market_price":89,"goods_img":"https://image.yunifang.com/yunifang/images/goods/446/goods_img/170627143627211691152946151.jpg","reservable":false,"efficacy":"水水润润 修护受损","stock_number":0,"restrict_purchase_num":0},{"id":"16","goods_name":"热销套装丨玫瑰滋养保湿四件套","shop_price":139.9,"market_price":259.9,"goods_img":"https://image.yunifang.com/yunifang/images/goods/16/goods_img/17062611152592656236701367.jpg","reservable":false,"efficacy":"一整套源源补水","stock_number":0,"restrict_purchase_num":0},{"id":"8","goods_name":"买就送素颜霜丨美白嫩肤面膜20片","shop_price":119.9,"market_price":359,"goods_img":"https://image.yunifang.com/yunifang/images/goods/8/goods_img/170929144780917903477663517.jpg","reservable":false,"efficacy":"真美白 匠心造","stock_number":0,"restrict_purchase_num":0},{"id":"14","goods_name":"买就送洗脸扑丨矿物泥浆鼻膜60g","shop_price":55,"market_price":69,"goods_img":"https://image.yunifang.com/yunifang/images/goods/14/goods_img/170930094138819848945676015.jpg","reservable":false,"efficacy":"草莓鼻小救星 收敛毛孔","stock_number":0,"restrict_purchase_num":0},{"id":"189","goods_name":"控油必备丨清爽平衡护肤三件套","shop_price":99.9,"market_price":179.9,"goods_img":"https://image.yunifang.com/yunifang/images/goods/189/goods_img/1709300953684984597198733.jpg","reservable":false,"efficacy":"深层清洁 平衡水油","stock_number":0,"restrict_purchase_num":0},{"id":"428","goods_name":"多彩水润亮颜蚕丝面膜套装21片","shop_price":79.9,"market_price":270.9,"goods_img":"https://image.yunifang.com/yunifang/images/goods/428/goods_img/17062610201873359203247864.jpg","reservable":false,"efficacy":"吸黑焕彩 补水保湿","stock_number":0,"restrict_purchase_num":0}]}
     */

    private int code;
    private String msg;
    private DataBean data;

    public int getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

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

    public DataBean getData() {
        return data;
    }

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

    public static class DataBean {
        private List<CategoryBean> category;
        private List<GoodsBriefBean> goodsBrief;

        public List<CategoryBean> getCategory() {
            return category;
        }

        public void setCategory(List<CategoryBean> category) {
            this.category = category;
        }

        public List<GoodsBriefBean> getGoodsBrief() {
            return goodsBrief;
        }

        public void setGoodsBrief(List<GoodsBriefBean> goodsBrief) {
            this.goodsBrief = goodsBrief;
        }

        public static class CategoryBean {
            /**
             * id : 16
             * cat_name : 按功效
             * is_leaf : 0
             * children : [{"id":"17","cat_name":"补水保湿","is_leaf":"1"},{"id":"31","cat_name":"舒缓修护","is_leaf":"1"},{"id":"19","cat_name":"控油去痘","is_leaf":"1"},{"id":"18","cat_name":"美白提亮","is_leaf":"1"},{"id":"20","cat_name":"紧致抗皱","is_leaf":"1"}]
             */

            private String id;
            private String cat_name;
            private String is_leaf;
            private List<ChildrenBean> children;

            public String getId() {
                return id;
            }

            public void setId(String id) {
                this.id = id;
            }

            public String getCat_name() {
                return cat_name;
            }

            public void setCat_name(String cat_name) {
                this.cat_name = cat_name;
            }

            public String getIs_leaf() {
                return is_leaf;
            }

            public void setIs_leaf(String is_leaf) {
                this.is_leaf = is_leaf;
            }

            public List<ChildrenBean> getChildren() {
                return children;
            }

            public void setChildren(List<ChildrenBean> children) {
                this.children = children;
            }

            public static class ChildrenBean {
                /**
                 * id : 17
                 * cat_name : 补水保湿
                 * is_leaf : 1
                 */

                private String id;
                private String cat_name;
                private String is_leaf;

                public String getId() {
                    return id;
                }

                public void setId(String id) {
                    this.id = id;
                }

                public String getCat_name() {
                    return cat_name;
                }

                public void setCat_name(String cat_name) {
                    this.cat_name = cat_name;
                }

                public String getIs_leaf() {
                    return is_leaf;
                }

                public void setIs_leaf(String is_leaf) {
                    this.is_leaf = is_leaf;
                }
            }
        }

        public static class GoodsBriefBean {
            /**
             * id : 121
             * goods_name : 镇店之宝丨美白嫩肤面膜7片
             * shop_price : 49.9
             * market_price : 99.0
             * goods_img : https://image.yunifang.com/yunifang/images/goods/121/goods_img/17062610568378169043195978.jpg
             * reservable : false
             * efficacy : 镇店之宝 美白爆款
             * stock_number : 0
             * restrict_purchase_num : 0
             */

            private String id;
            private String goods_name;
            private double shop_price;
            private double market_price;
            private String goods_img;
            private boolean reservable;
            private String efficacy;
            private int stock_number;
            private int restrict_purchase_num;

            public String getId() {
                return id;
            }

            public void setId(String id) {
                this.id = id;
            }

            public String getGoods_name() {
                return goods_name;
            }

            public void setGoods_name(String goods_name) {
                this.goods_name = goods_name;
            }

            public double getShop_price() {
                return shop_price;
            }

            public void setShop_price(double shop_price) {
                this.shop_price = shop_price;
            }

            public double getMarket_price() {
                return market_price;
            }

            public void setMarket_price(double market_price) {
                this.market_price = market_price;
            }

            public String getGoods_img() {
                return goods_img;
            }

            public void setGoods_img(String goods_img) {
                this.goods_img = goods_img;
            }

            public boolean isReservable() {
                return reservable;
            }

            public void setReservable(boolean reservable) {
                this.reservable = reservable;
            }

            public String getEfficacy() {
                return efficacy;
            }

            public void setEfficacy(String efficacy) {
                this.efficacy = efficacy;
            }

            public int getStock_number() {
                return stock_number;
            }

            public void setStock_number(int stock_number) {
                this.stock_number = stock_number;
            }

            public int getRestrict_purchase_num() {
                return restrict_purchase_num;
            }

            public void setRestrict_purchase_num(int restrict_purchase_num) {
                this.restrict_purchase_num = restrict_purchase_num;
            }
        }
    }
}

最终效果