RetorfitMVP+get+post

本文介绍了如何在MVP架构中利用Retrofit进行GET和POST请求。首先,文章说明了在项目根目录下的配置步骤,接着阐述了在model层创建Api接口的细节,包括定义接口方法。然后,详细讲解了如何集成和配置Retrofit库,接着分别展示了Model、View和Presenter层的职责。最后,文章提到了实际操作中的注意事项。
摘要由CSDN通过智能技术生成

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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值