电商开发mvp框架OKHttp框架

OKHttp
框架特性
仅支持GET和POST两种方式,其他如PUT等不太常用,就暂不支持
基于POST的大文本数据、二进制文件上传,即通过Http Body提交
表单提交,带有文件的表单提交和表单提交支持参数名重复,在后台接收到的是数组或集合
支持session保持
对HTTPS支持单向认证和双向认证
支持同步请求和异步请求,统一的数据处理接口
开箱即用,默认的配置基本上满足需求
在这里插入图片描述

需要添加的依赖

  //OKhttp依赖
    implementation("com.squareup.okhttp3:okhttp:4.2.0")


//解析依赖
    implementation 'com.google.code.gson:gson:2.8.5'

    //glidee
    implementation("com.github.bumptech.glide:glide:4.10.0") {
        exclude group: "com.android.support"
    }


    //recycelrview,列表控件,和listview差不多,升级版
    implementation 'androidx.recyclerview:recyclerview:1.1.0'
    implementation 'com.jakewharton:butterknife:10.2.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
    implementation 'com.github.tongchexinfeitao:QRCodeLibrary:1.0'

    //okhttp日志拦截器
    implementation 'com.squareup.okhttp3:logging-interceptor:4.2.2'

    //EventBus依赖
    implementation 'org.greenrobot:eventbus:3.1.1'

自定义拼接接口

public class Api {

    //自定义拼接接口

    public static String BASE_URL="http://172.17.8.100/";
    public static String BANNER_URL=BASE_URL+"small/commodity/v1/findCommodityByKeyword?keyword=手机&page=1&count=10";
}

Mvp
M层

//数据模型层,不需要写任何代码
public interface IBaseModel {
}

V层

//view层基类
public interface IBaseView {
}

p层

public abstract class BasePresenter<M extends IBaseModel,V extends IBaseView> {

    public M model;
    public WeakReference<V> weakReference;

    public BasePresenter(){
        model=initModel();//对model进行初始化
    }


    //绑定方法
    public void attch(V v){
        weakReference=new WeakReference<>(v);
    }

    protected abstract M initModel();


    //解绑:节省内存(防止内存泄露)
    public void deach(){
        if (weakReference!=null){
            weakReference.clear();
            weakReference=null;
        }
    }

    //获取MVP的View对象
    public V getView(){
        return weakReference.get();
    }
}

base封装Activity
BaseActivity

public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView {

    public P presenter;

    Unbinder unbinder;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //找布局
        setContentView(layoutId());

        unbinder= ButterKnife.bind(this);

        presenter=initPresneter();

        if (presenter!=null){
            presenter.attch(this);//绑定当前View
        }

        initView();

        initData();
    }

    protected abstract P initPresneter();

    protected abstract void initData();

    protected abstract void initView();

    protected abstract int layoutId();


    //释放资源
    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (unbinder!=null){
            unbinder.unbind();
        }
        if (presenter!=null){
            presenter.deach();
        }
    }
}

utils
OkHttpUtils

public class OkHttpUtils {

    Handler handler=new Handler();

    private static OkHttpUtils okHttpUtils;
    private OkHttpClient okHttpClient;

    public static OkHttpUtils getInstance() {
        if (okHttpUtils==null){
            synchronized (OkHttpUtils.class){
                if (okHttpUtils==null){
                    okHttpUtils=new OkHttpUtils();
                }
            }
        }
        return okHttpUtils;
    }

    private OkHttpUtils(){
        okHttpClient=new OkHttpClient.Builder()
                //拦截器
                .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
                .build();
    }

    //doget请求方法
    public void doGet(String url,OkHttpCallBack okHttpCallBack){

        Request request=new Request.Builder()
                .url(url)
                .get()
                .build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                if (okHttpCallBack!=null){
                    okHttpCallBack.failure(e);
                }
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                //子线程处理网络数据
                String result=response.body().string();
                if (okHttpCallBack!=null){
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            okHttpCallBack.success(result);
                        }
                    });
                }
            }
        });

    }

    //dopost请求方法
    public void doPost(String url, HashMap<String,String> params,OkHttpCallBack okHttpCallBack){
        FormBody.Builder builder=new FormBody.Builder();

        if (params!=null&&params.size()>0){
            for (Map.Entry<String, String> stringStringEntry : params.entrySet()) {
                builder.add(stringStringEntry.getKey(),stringStringEntry.getValue());
            }
        }

        Request request=new Request.Builder()
                .url(url)
                .post(builder.build())
                .build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                if (okHttpCallBack!=null){
                    okHttpCallBack.failure(e);
                }
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                //子线程处理网络数据
                String result=response.body().string();
                if (okHttpCallBack!=null){
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            okHttpCallBack.success(result);
                        }
                    });
                }
            }
        });



    }

    public interface OkHttpCallBack{
        void success(String result);
        void failure(Throwable throwable);
    }
}

契约类
IHomeContract

public interface IHomeContract {


    interface IModel extends IBaseModel {
        void getData(String url,IModelCallBack iModelCallBack);

        interface IModelCallBack{
            void success(HomeEntity homeEntity);
            void failure(Throwable throwable);
        }
    }

    interface IView extends IBaseView{
        void success(HomeEntity homeEntity);
        void failure(Throwable throwable);
    }

    interface IPresenter{
        void getData(String url);
    }
}

HomeModel抽基类
解析

public class HomeModel implements IHomeContract.IModel {
    @Override
    public void getData(String url, IModelCallBack iModelCallBack) {


        //解析
        OkHttpUtils.getInstance().doGet(url, new OkHttpUtils.OkHttpCallBack() {
            @Override
            public void success(String result) {
                final HomeEntity homeEntity = new Gson().fromJson(result, HomeEntity.class);
                if (iModelCallBack != null) {
                    iModelCallBack.success(homeEntity);

                }
            }

            @Override
            public void failure(Throwable throwable) {
                if (iModelCallBack != null) {
                    iModelCallBack.failure(throwable);
                }

            }
        });
    }
}

P层抽基类

public class HomePresenter extends BasePresenter<HomeModel, IHomeContract.IView> implements IHomeContract.IPresenter {
    @Override
    public void getData(String url) {
        model.getData(url, new IHomeContract.IModel.IModelCallBack() {
            @Override
            public void success(HomeEntity homeEntity) {
                getView().success(homeEntity);
            }

            @Override
            public void failure(Throwable throwable) {
                getView().failure(throwable);
            }
        });
    }

    @Override
    protected HomeModel initModel() {
        return new HomeModel();
    }
}

显示页面
MainActivity

public class MainActivity extends BaseActivity<HomePresenter> implements IHomeContract.IView {


    @BindView(R.id.rv)
    RecyclerView rv;

    @Override
    protected HomePresenter initPresneter() {
        return new HomePresenter();
    }

    @Override
    protected void initData() {
        //设置接口地址
        presenter.getData(Api.BASE_URL + "small/commodity/v1/findCommodityByKeyword?keyword=手机&page=1&count=10");

    }

    @Override
    protected void initView() {


        //设置recycelrview布局管理器(必须)
        rv.setLayoutManager(new GridLayoutManager(this,2));
    }

    @Override
    protected int layoutId() {
        return R.layout.activity_main;
    }


    @Override
    public void success(HomeEntity homeEntity) {

        //给recycelrview设置适配器

        final HomeAdapter homeAdapter = new HomeAdapter(this, homeEntity.getResult());

        rv.setAdapter(homeAdapter);
    }

    @Override
    public void failure(Throwable throwable) {

    }




}

RecyclerView适配器

public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewhorlder> {



    private Context context;
    private List<HomeEntity.ResultBean> list;

    public HomeAdapter(Context context, List<HomeEntity.ResultBean> list) {
        this.context = context;
        this.list = list;
    }

    @NonNull
    @Override
    public MyViewhorlder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //找布局

        final View inflate = View.inflate(context, R.layout.item_rev, null);

        final MyViewhorlder myViewhorlder = new MyViewhorlder(inflate);
        return myViewhorlder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewhorlder holder, int position) {
        //设置数据

        //设置文本数据
        holder.name.setText(list.get(position).getCommodityName());
        //设置图片资源
        Glide.with(context)
                .load(list.get(position).getMasterPic())
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher)
                .circleCrop()
                .into(holder.im);

        //点击跳转二维码界面
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                context.startActivity(new Intent(context, CodeActivity.class));
            }
        });

    }

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

    //自定义ViewHorlder
    class MyViewhorlder extends RecyclerView.ViewHolder {

        @BindView(R.id.im)
        ImageView im;
        @BindView(R.id.name)
        TextView name;

        public MyViewhorlder(@NonNull View itemView) {
            super(itemView);

            ButterKnife.bind(this, itemView);

        }
    }
}

二维码页面

public class CodeActivity extends BaseActivity {


    @BindView(R.id.et)
    EditText et;
    @BindView(R.id.b1)
    Button b1;
    @BindView(R.id.iv)
    ImageView iv;
    @BindView(R.id.tv_send)
    Button tvSend;
    @BindView(R.id.obj_send)
    Button objSend;

    @Override
    protected BasePresenter initPresneter() {
        return null;
    }

    @Override
    protected void initData() {

        iv.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                //通过imageView识别二维码图片的信息
                CodeUtils.analyzeByImageView(iv, new CodeUtils.AnalyzeCallback() {
                    @Override
                    public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
                        Toast.makeText(CodeActivity.this, ""+result, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onAnalyzeFailed() {
                        Toast.makeText(CodeActivity.this, "解析失败", Toast.LENGTH_SHORT).show();
                    }
                });


                return true;
            }
        });
    }

    @Override
    protected void initView() {

        ButterKnife.bind(this);

        CodeUtils.init(this);

        //注册eventbus
        EventBus.getDefault().register(this);


    }

    @Override
    protected int layoutId() {
        return R.layout.activity_code;
    }


    @OnClick(R.id.b1)
    public void onViewClicked() {

        //设置生成图片

        //二维码log
        final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

        final Bitmap image = CodeUtils.createImage(et.getText().toString(), 400, 400, bitmap);

        iv.setImageBitmap(image);
    }


    @OnClick({R.id.tv_send, R.id.obj_send})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.tv_send:

                //发送字符串
                EventBus.getDefault().post("kson");

                break;
            case R.id.obj_send:

                //发送对象
                EventBus.getDefault().post(et);

                break;
        }
    }


    //接受字符串
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void getString(String s){
        Toast.makeText(this, ""+s, Toast.LENGTH_SHORT).show();
    }

    //接收对象
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void getEdittext(EditText editText){

        Toast.makeText(this, ""+editText.getText().toString(), Toast.LENGTH_SHORT).show();

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值