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<Bean> 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> T setCreate(Class<T> reqServer) { return mRetrofit.create(reqServer); } }
然后重点来了 Mvp~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(); } }
model层里面获取网络请求并且传给P层进行信息传递
然后就是P层里面:Per为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<Bean>() { @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); } }
public class Per implements Model.Getdata,Gong<View>{ private Model model; //软引用 private WeakReference<View> 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>(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 <T> {
public void onAttach(T View);
public void onDeattch();
}
哼,适配器都给你们写!public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHondler>{
Context context;
List<Bean.RetBean.ListBean> list;
public MyAdapter(Context context, List<Bean.RetBean.ListBean> 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<Bean.RetBean.ListBean> 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();
}
}
效果图就不上传了,这次小编写的很详细!