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();
}
}
效果图就不上传了,这次小编写的很详细!