这些是封装好之后的列表图,不要纠结命名规范,为了方便查看,相同的我都用的一个名字,只是改了后缀,上面是类的介绍,已实物为主
下面是代码,先从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); } }