MVP加载框架以及网络请求


这些是封装好之后的列表图,不要纠结命名规范,为了方便查看,相同的我都用的一个名字,只是改了后缀,上面是类的介绍,已实物为主

下面是代码,先从V层开始,别忘了添加权限和依赖,解析的Bean类我就不写了,自己看着弄,全局App类别忘了在清单文件中声明:

  //网络请求依赖
compile 'com.squareup.okhttp3:okhttp:3.6.0'
//gson解析依赖
compile 'com.google.code.gson:gson:2.8.1'
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>

-------------------------------------------------
public class App extends Application{
    public static FragmentActivity mBaseActivity;
    public  static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();

    }
------------------------------------------------------------------

public class MainActivity extends AppCompatActivity implements HomeContract.MainView{
    //map集合,保存参数,在OkHttpUtils中进行拼接
public static Map<String ,String> map=new HashMap<>();
   private  HomeContract.Presenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      //这两个可以放在摘出来的activity父类里,然后main去继承父类,避免每一个类都要写
        App.mContext=this;
        App.mBaseActivity=this;
        getint();
    }

    public void  getint(){
        //实例化p层
        MainPresenter versionPresenter=new MainPresenter(this);
        JSONObject jsonObject=new JSONObject();
        try {
            jsonObject.put("deviceType","ANDROID");
            map.put("参数1", "参数1");
            map.put("参数2", "参数2");
            map.put("参数3",jsonObject.toString()+"参数3");

            //调用p层中的方法
            presenter.getBean();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    //实例化p层
    @Override
    public void setPresenter(HomeContract.Presenter presenter) {
              this.presenter=presenter;
    }
//得到回调的bean类
    @Override
    public void getBean(Bean bean) {
        Toast.makeText(MainActivity.this,bean.getCode()+"",Toast.LENGTH_SHORT).show();

    }
//得到回调的错误信息
    @Override
    public void getError(String string) {

    }
}
-------------------------------网络请求类与接口---------------------------------------

/**
 * 实例化网络请求类
 * Created by Administrator on 2018/3/22.
 */

public class HttpFactroy {
    public static IHttp create(){
        return OkHttpUtils.getInstance();
    }
}
/** * 网络请求的接口 * Created by Administrator on 2018/3/22. */ public interface IHttp { < T> void get(String url, Map<String, String> params, MyNetWorkCallback< T> callback); < T> void post(String url, Map<String, String> params, MyNetWorkCallback< T> callback); void upload(); void download(); < T> void loadImage(String url, Map<String, String> params,MyNetWorkCallback< T> callback);}
-------------有时候报错的话请看看你导入的包对不对------------------------
import android.util.Log;
import com.example.administrator.mvpfengzhuang.App;
import com.example.administrator.mvpfengzhuang.p.model.MyNetWorkCallback;
import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import static android.content.ContentValues.TAG;

/**
 * 网络请求类
 * Created by Administrator on 2018/3/22.
 */


public class OkHttpUtils implements IHttp {
    public final static int CONNECT_TIMEOUT =7000;
    public final static int READ_TIMEOUT=7000;
    public final static int WRITE_TIMEOUT=7000;
    private final long MAX_SIZE= 8*1024*1024;;
    private OkHttpClient okHttpClient;
    //构造函数私有化
    private OkHttpUtils(){
        //创建Cache对象,并设置缓存路径以及缓存区域大小
        File cacheDir = App.mContext.getCacheDir();//获取应用的缓存路径
        Cache cache = new Cache(cacheDir,MAX_SIZE);
        okHttpClient = new OkHttpClient.Builder()
                .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)//设置读取超时时间
                .writeTimeout(WRITE_TIMEOUT,TimeUnit.SECONDS)//设置写的超时时间
                .connectTimeout(CONNECT_TIMEOUT,TimeUnit.SECONDS)//设置连接超时时间
                .cache(cache).addNetworkInterceptor(new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        // 1、通过Chain对象获取Request对象
                        Request request = chain.request();
                        //2、通过Chain对象重新发起请求,并获取Response对象
                        Response proceed = chain.proceed(request);
                        //移除头部信息:Pragma、Cache-Control
                        Response response = proceed.newBuilder().removeHeader("Pragma")
                                .removeHeader("Cache-Control").addHeader("Cache-Control", "max-age=" + (60))
                                .build();
                        return response;
                    }
                }).build();
    }


    private static OkHttpUtils okHttpUtils;

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

    /**
     * 发送get请求
     * @param url 请求地址
     * @param params 请求参数
     * @param callback 回调
     * @param <T> 请求回来的数据对应的JavaBean
     */
    @Override
    public <T> void get(String url, Map<String, String> params, final MyNetWorkCallback<T> callback) {

        StringBuffer sb = new StringBuffer(url);
        if(params != null && params.size() > 0){
            sb.append("?");
            Set<String> keys = params.keySet();
            for (String key : keys) {
                String value = params.get(key);
                sb.append(key).append("=").append(value).append("&");
            }
            url = sb.deleteCharAt(sb.length()-1).toString();
        }
        final Request request = new Request.Builder().url(url).build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                App.mBaseActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //执行在主线程
                        callback.onError(404,e.getMessage().toString());
                    }
                });

            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                final String jsonData = response.body().string();
                //执行在子线程中
                App.mBaseActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //执行在主线程
                        Log.e("TAG","JsonData:"+jsonData);
                        callback.onSuccess(getGeneric(jsonData,callback));
                    }
                });

            }
        });

    }

    @Override
    public <T> void post(String url, Map<String, String> params, final MyNetWorkCallback<T> callback) {

        FormBody.Builder builder = new FormBody.Builder();
        StringBuffer sb=new StringBuffer();
        if(params !=null && params.size() > 0){
            for (Map.Entry<String, String> entry : params.entrySet()) {
                sb.append(entry.getKey()+"="+entry.getValue()+"&");
                builder.add(String.valueOf(entry.getKey()),String.valueOf(entry.getValue()));
            }
        }


        Log.e("TAG","网络接口:"+ url+"?"+sb.toString());
        Request request = new Request.Builder().url(url).post(builder.build()).build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                App.mBaseActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //执行在主线程
//                        callback.onError(404,e.getMessage().toString());
                    }
                });

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String jsonData = response.body().string();
                //执行在子线程中
                App.mBaseActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //执行在主线程
                        Log.e("TAG","jsonData:"+jsonData);
                        callback.onSuccess(getGeneric(jsonData,callback));
                    }
                });

            }
        });
    }

    @Override
    public void upload() {

    }

    @Override
    public void download() {

    }

    @Override
    public<T> void loadImage(String url, Map<String, String> params, final MyNetWorkCallback<T> callback) {
        FormBody.Builder builder = new FormBody.Builder();//表单对象,包含以input开始的对象,以html表单为主
        //把map集合中的参数添加到FormBody表单中.
        if (null != params && !params.isEmpty()) {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                builder.add(entry.getKey(), entry.getValue());
            }
            RequestBody requestBody = builder.build();//创建请求体
            Request request = new Request.Builder().url(url).post(requestBody).build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, final IOException e) {
                    Log.d(TAG, "IOException" + e.toString());
                    App.mBaseActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //执行在主线程
                            callback.onError(404,e.toString());
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    if (null != response && response.isSuccessful()) {
                        final String jsonData = response.body().string();
                        Log.d(TAG, "loadImage=" + jsonData);
                        //执行在子线程中
                        App.mBaseActivity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //执行在主线程
                                callback.onSuccess(getGeneric(jsonData,callback));
                            }
                        });

                    }
                }
            });
        }
    }

    /**
     * 自动解析json至回调中的JavaBean
     * @param jsonData
     * @param callBack
     * @param <T>
     * @return
     */
    private <T> T getGeneric(String jsonData,MyNetWorkCallback<T> callBack){
        Gson gson = new Gson();
        //通过反射获取泛型的实例
        Type[] types = callBack.getClass().getGenericInterfaces();
        Type[] actualTypeArguments = ((ParameterizedType) types[0]).getActualTypeArguments();
        Type type = actualTypeArguments[0];

        T t = gson.fromJson(jsonData,type);
        return t;
    }


}

------------------------------------p层管理接口------------------------------------

/**
 * 接口类,用来实现不同功能,管理V层重写的方法。
 * Created by Administrator on 2018/3/22.
 */

public interface HomeContract {
    //测试案例
    //V层实现接口
    interface MainView extends BaseView<Presenter>{
        //V层实现接口,接收返回信息,参数是用来传递的Bean类,也可以是解析的json串,看需求
        void getBean(Bean bean);
        //接收返回错误信息
        void getError(String string);
    }
    //注册
    interface Presenter extends BasePresenter.MainBase {
    }
}
/**
 * 管理P层实现接口中重写的方法
 * Created by Administrator on 2018/3/22.
 */

public interface BasePresenter {
    //p层重写的方法,如果更多,就接着往下排
    interface MainBase{
        void getBean();//用来接收M层回调的接口,同时也是V层启动接口

    }
}
 
 
/**
 * p层中用来实例化V层方法,如果一个类实现多个接口,这里会报错,可以选择将那个类的接口写在一个里
或者在创建一个BaseView2
 * Created by Administrator on 2018/3/22.
 */

public interface BaseView<T> {
    void setPresenter(T t);
}
---------------------------p层-------------------------------------
 
 
/**
 * 实现的p层
 * Created by Administrator on 2018/3/22.
 */

public class MainPresenter implements HomeContract.Presenter {
    private HomeContract.MainView mainView;
    private  MainModelImp mainModelImp;

    public MainPresenter(HomeContract.MainView mainView){
        this.mainView=mainView;
        this.mainView.setPresenter(this);
     //实例化M层
        mainModelImp = new MainModelImp();
    }


    @Override
    public void getBean() {
        mainModelImp.getData(new MyNetWorkCallback<Bean>() {
            @Override
            public void onSuccess(Bean bean) {
                //得到回调的bean类,传递回V
                mainView.getBean(bean);
            }

            @Override
            public void onError(int errorCode, String errorMsg) {
                  //得到回调的错误信息
                mainView.getError(errorMsg);
            }
        });
    }
}
------------------------------------M层---------------------
 
 
/**
 * //用来在网络请求中进行接口回调得到数据
 * Created by Administrator on 2018/3/22.
 */

public interface MyNetWorkCallback<T> {
 void onSuccess(T t);
 void onError(int errorCode,String errorMsg);
}
 
 

/**
 * 用来实例化, 网络请求
 * Created by Administrator on 2018/3/22.
 */

public interface BaseModel {
    public static IHttp iHttp = HttpFactroy.create();
}

 
 
/**
 * //集成实例化接口,通过继承得到网络请求的对象,
 * Created by Administrator on 2018/3/22.
 */

public interface MainModel extends BaseModel {
    //M层实现的接口,通过MyNetWorkCallback传入解析的bean类进行接口回调得到数据
    void getData(MyNetWorkCallback<Bean> callback);
}
/**
 * Created by Administrator on 2018/3/22.
 */

public class MainModelImp implements MainModel{
    @Override
    public void getData(MyNetWorkCallback<Bean> callback) {
        //post请求,参数L:接口路径,保存参数的map集合,callback;
         iHttp.post("http://www.baidu.com", MainActivity.map,callback);
    }
}






猜你喜欢

转载自blog.csdn.net/liu_ser/article/details/79651158