MVP框架的搭建+Okhttp网络工具类

1View层的接口Iview

package com.example.guoxinyu20181220.view;

public interface Iview<E> {
    void requestData(E e);
    void requestFail(E e);
}

2.V层实现类(可以是Activity也可以是Fragment)

package com.example.guoxinyu20181220;

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

import com.example.guoxinyu20181220.presenter.PresenterImpl;
import com.example.guoxinyu20181220.view.Iview;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements Iview {

    private PresenterImpl presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        presenter = new PresenterImpl(this);
        initView();
        initData();
    }
    //请求 网络地址调用p层方法
    private void initData() {
       /* Map<String,String> map = new HashMap<>();
        map.put("page",String.valueOf(1));*/
        //presenter.startRequest("网络接口","map集合chuancan","对应的bean类");
    }

    //初始化view
    private void initView() {
        //TODO
    }

    @Override
    public void requestData(Object o) {

    }

    @Override
    public void requestFail(Object o) {

    }

    //防止内存泄漏调用p层的方法

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.onDetach();
    }
}

3.P层的接口

package com.example.guoxinyu20181220.presenter;

import java.util.Map;

public interface Ipresenter {
    void startRequest(String url, Map<String,String> map,Class clazz);
}

4.P层的实现类

package com.example.guoxinyu20181220.presenter;

import com.example.guoxinyu20181220.MainActivity;
import com.example.guoxinyu20181220.model.ModelImpl;
import com.example.guoxinyu20181220.view.Iview;

import java.util.Map;

public class PresenterImpl implements Ipresenter {
    private Iview mIview;
    private ModelImpl model;

    public PresenterImpl(Iview iview) {
        mIview = iview;
        model = new ModelImpl();
    }

    @Override
    public void startRequest(String url, Map<String, String> map, Class clazz) {
        //通过M层调用M层方法
        //model.requestData();
    }

    //防止内存泄漏
    public void onDetach(){
        if(model!=null){
            model = null;
        }
        if(mIview!=null){
            mIview = null;
        }
    }
}

5.M层接口

package com.example.guoxinyu20181220.model;

import java.util.Map;

public interface Imodel {
    void requestData(String url, Map<String,String> map,Class clazz,MyCallBack myCallBack);
}

6.在创建一个接口为了给P层传递数据

package com.example.guoxinyu20181220.model;

public interface MyCallBack<E> {
    void setData(E data);
}

7.M层的实现类

package com.example.guoxinyu20181220.model;

import com.example.guoxinyu20181220.util.OkHttpUtils;

import java.util.Map;

public class ModelImpl implements Imodel {
    private MyCallBack myCallBack;
    @Override
    public void requestData(String url, Map<String, String> map, Class clazz, MyCallBack myCallBack) {
        this.myCallBack = myCallBack;
        //调用工具类
        //post请求
        //OkHttpUtils.getIntance().doPost();
        //get请求
        //OkHttpUtils.getIntance().doGet();
    }
}

8.Okhttp网络请求工具类需要创建一个接口ICallBack

package com.example.guoxinyu20181220.util;

public interface ICallBack {
    void success(Object o);
    void faniled(Exception e);
}

9.Okhttp工具类里面封装了get和post请求

package com.example.guoxinyu20181220.util;

import android.os.Handler;
import android.os.Looper;

import com.google.gson.Gson;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;

public class OkHttpUtils {
    private static OkHttpUtils intance;
    private final OkHttpClient httpClient;
    private Handler handler = new Handler(Looper.myLooper());
    public OkHttpUtils() {
        //日志拦截器
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        httpClient = new OkHttpClient.Builder()
                .connectTimeout(10,TimeUnit.SECONDS)
                .readTimeout(10,TimeUnit.SECONDS)
                .writeTimeout(10,TimeUnit.SECONDS)
                .addInterceptor(interceptor)
                .build();
    }

    public static OkHttpUtils getIntance() {
        if(intance == null){
            synchronized (OkHttpUtils.class){
                intance = new OkHttpUtils();
            }
        }
        return intance;
    }
    /**
     * 异步get请求
     * */
    public void doGet(String url, String params, final Class clazz, final ICallBack iCallBack){
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        Call call = httpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
               handler.post(new Runnable() {
                   @Override
                   public void run() {
                       iCallBack.faniled(e);
                   }
               });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    String result = response.body().string();
                    Gson gson = new Gson();
                    final Object o = gson.fromJson(result, clazz);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            iCallBack.success(o);
                        }
                    });
                }catch (Exception e){
                    iCallBack.faniled(e);
                }
            }
        });
    }
    /**
     * 异步post请求
     * */
    public void doPost(String url, Map<String,String> map, final Class clazz, final ICallBack iCallBack){
        FormBody.Builder builder = new FormBody.Builder();
        for(Map.Entry<String,String> entry:map.entrySet()){
            builder.add(entry.getKey(),entry.getValue());
        }
        RequestBody body = builder.build();
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Call call = httpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        iCallBack.faniled(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                    try {
                        String result = response.body().string();
                        Gson gson = new Gson();
                        final Object o = gson.fromJson(result, clazz);
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                iCallBack.success(o);
                            }
                        });
                    }catch (Exception e){
                        iCallBack.faniled(e);
                    }
            }
        });
    }
}

猜你喜欢

转载自blog.csdn.net/guoxinyu1207/article/details/85156404