Retrfit+Rxjava+Okhttp+Mvp这次很总结!

    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.squareup.okhttp3:okhttp:3.1.2'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
    compile 'io.reactivex:rxjava:1.0.14'
    compile 'io.reactivex:rxandroid:1.0.1'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'


开始的话先让大家看看这次的接口好吧~

http://api.svipmovie.com/front/columns/getVideoList.do?catalogId=402834815584e463015584e539330016&pnum=1
开始的接口拼接为: Interface类

public interface Interface {
    @GET("columns/getVideoList.do")
    Observable getBean(@Query("catalogId") String catalogId, @Query("pnum") int pnum);
}
然后就是: RetrofitUnitl的封装感觉不错大家使用下

public class RetrofitUnitl {
    private Retrofit mRetrofit;
    private String baseUrl;
    OkHttpClient client;
    private static RetrofitUnitl mRetrofitManager;
    private RetrofitUnitl(String baseUrl,OkHttpClient client){
        this.baseUrl=baseUrl;
        this.client=client;
        initRetrofit();
    }
    public static synchronized RetrofitUnitl getInstance(String baseUrl,OkHttpClient client){
        if (mRetrofitManager == null){
            mRetrofitManager = new RetrofitUnitl(baseUrl,client);
        }
        return mRetrofitManager;
    }
    private void initRetrofit() {
        mRetrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(client)
                .build();
    }
    public  T setCreate(Class reqServer) {
        return mRetrofit.create(reqServer);
    }
}
我觉得网络拦截器还是给大家写上把

public class LoggingInterceptor implements Interceptor {
    public static String TAG = "LoggingInterceptor";
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request request = chain.request();
        long startTime = System.currentTimeMillis();
        Response response = chain.proceed(chain.request());
        long endTime = System.currentTimeMillis();
        long duration=endTime-startTime;
        MediaType mediaType = response.body().contentType();
        String content = response.body().string();
        Log.d(TAG,"\n");
        Log.d(TAG,"----------Start----------------");
        Log.d(TAG, "| "+request.toString());
        String method=request.method();
        if("POST".equals(method)){
            StringBuilder sb = new StringBuilder();
            if (request.body() instanceof FormBody) {
                FormBody body = (FormBody) request.body();
                for (int i = 0; i < body.size(); i++) {
                    sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");
                }
                sb.delete(sb.length() - 1, sb.length());
                Log.d(TAG, "| RequestParams:{"+sb.toString()+"}");
            }
        }
        Log.d(TAG, "| Response:" + content);
        Log.d(TAG,"----------End:"+duration+"毫秒----------");
        return response.newBuilder()
                .body(ResponseBody.create(mediaType, content))
                .build();
    }

}
然后重点来了 Mvp~
model层里面获取网络请求并且传给P层进行信息传递

public class Model {
    public void Getdata(String catalogId,int pnum) {
        String baseurl = "http://api.svipmovie.com/front/";
        OkHttpClient ok = new OkHttpClient.Builder()
                .addInterceptor(new LoggingInterceptor())
                .build();
        RetrofitUnitl.getInstance(baseurl, ok)
                .setCreate(Interface.class)
                .getBean(catalogId, pnum)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Subscriber() {
                    @Override
                    public void onCompleted() {
                    }
                    @Override
                    public void onError(Throwable e) {
                    }
                    @Override
                    public void onNext(Bean listBeen) {
                        Log.e("qq",listBeen.toString());
                        getdata.Success(listBeen);
                    }
                });
    }
       Getdata getdata;
       public void setGetdata(Getdata getdata) {
             this.getdata = getdata;
       }

      public interface Getdata{
        void Success(Bean listBeen);
   }
}
然后就是P层里面:Per为P层名字 乱取的 别介意.


public class Per implements Model.Getdata,Gong{
    private Model model;
    //软引用
    private WeakReference weak;
    public Per (View view1){
        this.model=new Model();
        onAttach(view1);
        model.setGetdata(this);
    }
    //拿到数据
    public void getData(String catalogId,int pnum){
       model.Getdata(catalogId,pnum);
    }

    @Override
    public void onAttach(View view) {
        weak=new WeakReference(view);
    }

    @Override
    public void onDeattch() {
        weak.clear();
    }
    @Override
    public void Success(Bean listBeen) {
        weak.get().Succee(listBeen);
    }
}
view层里面写P层传过来的数据

public interface View {
    void Succee(Bean listBeen);
}
Mvp大家使用时候知道他的劣势就是无法在Activtiy结束时候将P层关掉时间一长就是内存泄漏所以P层的时候有软应用和Auttch方法 最后在Activity里面关掉!
写了个公共的类来编写解决方法!

public interface Gong  {
    public void onAttach(T View);
    public void onDeattch();
}
哼,适配器都给你们写!
public class MyAdapter extends RecyclerView.Adapter{
    Context context;
    List list;
    public MyAdapter(Context context, List list) {
        this.context = context;
        this.list = list;
    }
    @Override
    public MyViewHondler onCreateViewHolder(ViewGroup parent, int viewType) {
        View view=View.inflate(context,R.layout.recyclerview_item1,null);
        MyViewHondler myViewHondler=new MyViewHondler(view);
        return myViewHondler;
    }
    @Override
    public void onBindViewHolder(MyViewHondler holder, int position) {
        ImageLoader.getInstance().displayImage(list.get(position).getPic(),holder.im, Myapp.getDisk());
        holder.tv.setText(list.get(position).getDescription());
        holder.tv1.setText(list.get(position).getTitle());
    }
    @Override
    public int getItemCount() {
        return list.size();
    }
    public class MyViewHondler extends RecyclerView.ViewHolder{
        ImageView im;
        TextView tv;
        TextView tv1;
        public MyViewHondler(View itemView) {
            super(itemView);
            im=  itemView.findViewById(R.id.recyclerview_img);
            tv= itemView.findViewById(R.id.recyclerview_text);
            tv1= itemView.findViewById(R.id.recyclerview_text1);
        }
    }
}
这里面我用的imager_loader并不是不想用其他的就是习惯了.
public class Myapp extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        ImageLoaderConfiguration con=new ImageLoaderConfiguration.Builder(this)
                       .threadPriority(100)
                        .threadPoolSize(3)
                        .memoryCacheExtraOptions(200,200)
                        .memoryCacheSize(2*1024*1024)
                        .diskCacheSize(50*1024*1024)
                        .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                        .build();
                ImageLoader.getInstance().init(con);
            }
            public static DisplayImageOptions getDisk(){
                DisplayImageOptions options=new DisplayImageOptions.Builder()
                       .showImageOnFail(R.mipmap.ic_launcher)
                        .showImageOnLoading(R.mipmap.ic_launcher)
                        .showImageForEmptyUri(R.mipmap.ic_launcher)
                        .cacheInMemory(true)
                        .build();
                return options;
            }
    }
最后在Activity写出实现View层的逻辑代码和实现在Activity的代码
public class MainActivity extends AppCompatActivity implements View{
    private RecyclerView rv;
    private Per per;
    final String catalogId = "402834815584e463015584e539330016";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        cc();
    }

    private void cc() {
        rv= (RecyclerView) findViewById(R.id.re);
        per=new Per(MainActivity.this);
        per.getData(catalogId,getNextPage());
    }


    @Override
    public void Succee(Bean listBeen) {
        List c=listBeen.getRet().getList();
        MyAdapter a=new MyAdapter(MainActivity.this,c);
        rv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        rv.setAdapter(a);
    }
    private int getNextPage() {
        int page = getRandomNumber(1, 108);
        return page;
    }
    public static int getRandomNumber(int min, int max) {
        return new Random().nextInt(max) % (max - min + 1) + min;
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
         per.onDeattch();
    }
}

 效果图就不上传了,这次小编写的很详细!


你可能感兴趣的:(Retrfit+Rxjava+Okhttp+Mvp这次很总结!)