1.在根目录下最底部:
ext {
// Sdk and tools
minSdkVersion = 19
targetSdkVersion = 26
compileSdkVersion = 26
buildToolsVersion = '26.0.2'
//support版本
supportVersion = '27.1.0'
constraintLayout = '1.0.2'
junit = '4.12'
testRunner = '1.0.1'
espressoCore = '3.0.1'
interceptor = "3.11.0"
retrofit = '2.3.0'
converterGson = '2.3.0'
rxandroid = '1.2.1'
rxjava = '1.3.0'
rxbus = '1.0.6'
adapterRxjava = '2.0.2'
}
2.在model下:
// 网络请求Retrofit & OkHttp & Rxjava
implementation "com.squareup.okhttp3:logging-interceptor:$rootProject.interceptor"
implementation "com.squareup.retrofit2:retrofit:$rootProject.retrofit"
implementation "com.squareup.retrofit2:converter-gson:$rootProject.converterGson"
implementation "io.reactivex:rxandroid:$rootProject.rxandroid"
implementation "io.reactivex:rxjava:$rootProject.rxjava"
implementation "com.hwangjr.rxbus:rxbus:$rootProject.rxbus"
implementation "com.squareup.retrofit2:adapter-rxjava:$rootProject.adapterRxjava"
//或者
compile 'com.squareup.retrofit2:retrofit:2.1.0'//retrofit
compile 'com.google.code.gson:gson:2.6.2'//Gson 库
//下面两个是RxJava 和RxAndroid
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'//转换器,请求结果转换成Model
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'//配合Rxjava 使用
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0' //拦截日志
3.先创建一个Api
import java.util.Map;
import okhttp3.ResponseBody;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
import rx.Observable;
public interface BaceApis<T> {
//get
@GET
Observable<ResponseBody> get(@Url String url);
//post
@POST
Observable<ResponseBody> post(@Url String url, @QueryMap Map<String,String> map);
//图片文字上传
@POST
@Multipart
Observable<ResponseBody> postImageContent(@Url String url ,@QueryMap Map<String, String> map ,@Part MultipartBody.Part parts);
}
4. Retorfit
package com.bw.ymy.taobao.mvp.okhttp;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class Retorfit {
//这个是网址里面共有的
private final String BASE_URL = "http://172.17.8.100/small/";
private static Retorfit retrofitManager;
//单列
public static synchronized Retorfit getInstance()
{
if(retrofitManager==null)
{
retrofitManager=new Retorfit();
}
return retrofitManager;
}
//拿到BaceApis
private BaceApis baceApis;
//读写拦截器
public Retorfit()
{
HttpLoggingInterceptor httpLoggingInterceptor=new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder=new OkHttpClient.Builder();
builder.connectTimeout(15,TimeUnit.SECONDS);
builder.readTimeout(15,TimeUnit.SECONDS);
builder.writeTimeout(15,TimeUnit.SECONDS);
builder.addInterceptor(httpLoggingInterceptor);
builder.retryOnConnectionFailure(true);
OkHttpClient client=builder.build();
Retrofit retrofit=new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(BASE_URL)
.client(client)
.build();
baceApis=retrofit.create(BaceApis.class);
}
/**
* 可以这样生成Map<String, RequestBody> requestBodyMap
* Map<String, String> requestDataMap这里面放置上传数据的键值对。
*/
public Map<String, RequestBody> generateRequestBody(Map<String,String> requestDataMap)
{
Map<String,RequestBody> requestBodyMap=new HashMap<>();
for (String key:requestDataMap.keySet())
{
RequestBody requestBody
=RequestBody.create(MediaType.parse("multipart/form-data"),
requestDataMap.get(key)==null ? "" : requestDataMap.get(key));
requestBodyMap.put(key,requestBody);
}
return requestBodyMap;
}
//get请求
public void get(String url,HttpListener listener)
{
baceApis.get(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver(listener));
}
/**
* 普通post请求
*/
public Retorfit post(String url, Map<String, String> map,HttpListener listener) {
if (map == null) {
map = new HashMap<>();
}
baceApis.post(url, map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver(listener));
return retrofitManager;
}
//图片文字上传
//图文上传
public void postimagecon(String url,Map<String,String> params, File file,ICallBack callBack){
RequestBody requestBody=RequestBody.create(MediaType.parse("multipart/form-data"),file);
MultipartBody.Part filePart=MultipartBody.Part.createFormData("image",file.getName(),requestBody);
baseApis.postImageContent(url,params,filePart)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getObserver(callBack));
}
public Observer getObserver(final HttpListener listener)
{
Observer observer = new Observer<ResponseBody>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
if (listener != null) {
listener.onFail(e.getMessage());
}
}
@Override
public void onNext(ResponseBody responseBody) {
try {
String string = responseBody.string();
if (listener != null) {
listener.onSuccess(string);
}
} catch (IOException e) {
e.printStackTrace();
if (listener != null) {
listener.onFail(e.getMessage());
}
}
}
};
return observer;
}
public HttpListener listener;
public void setHttpListener(HttpListener httpListener){
this.listener = httpListener;
}
public interface HttpListener {
void onSuccess(String data);
void onFail(String error);
}
}
5.M
public interface IModel {
//post
void getRequest(String urlstr, Map<String, String> map, Class clazz, MyCallBack callBack);
//get
void getData(String urlstr,Class clazz, MyCallBack callBack);
//上传图文
void postImageConRequestModel(String url, Map<String,String> params, File file , Class clazz , MCallBack callBack);
}
//继承
public class IModellpl implements IModel {
//post
@Override
public void getRequest(String urlstr, Map<String, String> map, final Class clazz, final MyCallBack callBack) {
//post json 解析
Retorfit.getInstance().post(urlstr, map, new Retorfit.HttpListener() {
@Override
public void onSuccess(String data) {
try {
Object o=new Gson().fromJson(data,clazz);
if(callBack!=null)
{
callBack.onsuccess(o);
}
}catch (Exception e)
{
e.printStackTrace();
if(callBack!=null)
{
callBack.onFail(e.getMessage());
}
}
}
@Override
public void onFail(String error) {
if(callBack!=null)
{
callBack.onFail(error);
}
}
});
}
//get
@Override
public void getData(String urlstr, final Class clazz, final MyCallBack callBack) {
Retorfit.getInstance().get(urlstr, new Retorfit.HttpListener() {
@Override
public void onSuccess(String data) {
Object o=new Gson().fromJson(data,clazz);
if(callBack!=null)
{
callBack.onsuccess(o);
}
}
@Override
public void onFail(String error) {
if(callBack!=null)
{
callBack.onFail(error);
}
}
});
}
//图文上传
@Override
public void postImageConRequestModel(String url, Map<String, String> params, File file, final Class clazz, final MCallBack callBack) {
RetorfitManager.getInstace().postimagecon(url,params ,file, new RetorfitManager.ICallBack() {
@Override
public void success(String result) {
Object o = new Gson().fromJson(result, clazz);
callBack.success(o);
}
@Override
public void failure(String error) {
callBack.failure(error);
}
});
}
}
6.V
package com.bw.ymy.taobao.mvp.view;
public interface IView<T> {
//返回
void onsuccess(T data);
}
7.P
package com.bw.ymy.taobao.mvp.prenster;
import java.util.Map;
public interface IPrenser {
//post
void getRequest(String url, Map<String, String> map, Class clazz);
//get
void getData(String url, Class clazz);
//图文
//图文上传
void postImageConRequestIpresenter(String url, Map<String,String> params , File file, Class clazz);
}
//继承
package com.bw.ymy.taobao.mvp.prenster;
import com.bw.ymy.taobao.mvp.model.IModellpl;
import com.bw.ymy.taobao.mvp.mycalllback.MyCallBack;
import com.bw.ymy.taobao.mvp.view.IView;
import java.util.Map;
public class IPrenserlpl implements IPrenser {
private IView iView;
private IModellpl iModellpl;
public IPrenserlpl(IView iView) {
this.iView = iView;
iModellpl=new IModellpl();
}
@Override
public void getRequest(String url, Map<String, String> map, Class clazz) {
iModellpl.getRequest(url, map, clazz, new MyCallBack() {
@Override
public void onsuccess(Object data) {
iView.onsuccess(data); }
@Override
public void onFail(String error) {
iView.onsuccess(error);
}
});
}
//get
@Override
public void getData(String url, Class clazz) {
iModellpl.getData(url, clazz, new MyCallBack() {
@Override
public void onsuccess(Object data) {
iView.onsuccess(data);
}
@Override
public void onFail(String error) {
iView.onsuccess(error);
}
});
}
@Override
public void postImageConRequestIpresenter(String url, Map<String, String> params, File file, Class clazz) {
iModel.postImageConRequestModel(url, params, file, clazz, new MCallBack() {
@Override
public void success(Object object) {
iView.success(object);
}
@Override
public void failure(String error) {
iView.failure(error);
}
});
}
//mvp解绑
public void detach()
{
iModellpl=null;
iView=null;
}
}
8.
package com.bw.ymy.taobao.Api;
public class Api {
//登录
public static final String login="user/v1/login";
//注册
public static final String sing="user/v1/register";
//get请求参数在网址里面写
quznzi="http://172.17.8.100/small/circle/v1/findCircleList?userid=1010&sessionid=15320748258726&page=1&count=5";
}
9.
package com.bw.ymy.taobao.mvp.icallback;
public interface ICallBack {
void Onsuccess(Object obj);
void onFail(Exception e);
}
package com.bw.ymy.taobao.mvp.mycalllback;
public interface MyCallBack<T> {
void onsuccess(T data);
void onFail(String error);
}