栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android  Retrofit和Rxjava的网络请求

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android  Retrofit和Rxjava的网络请求

Android  Retrofit和Rxjava的网络请求

去年的时候好多公司就已经使用Rxjava和Retrofit了,最近自自己学习了一下,感觉真的是很好用,让自己的网络请求变得更简单了,而且封装性极强。

首先做一下准备工作,导入需要引用的文件

compile 'com.android.support:appcompat-v7:25.1.0'
 testCompile 'junit:junit:4.12'
 compile 'io.reactivex:rxjava:1.1.0'
 compile 'io.reactivex:rxandroid:1.1.0'
 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
 compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
 compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
 compile 'com.google.code.gson:gson:2.6.2'
 compile 'com.jakewharton:butterknife:7.0.1'
 compile 'com.android.support:recyclerview-v7:25.1.0'

网络请求的地址:https://api.douban.com/v2/movie/top250?start=0&count=10

添加网络请求权限

首先看一下Retrofit的使用基本用法

创建一个接口类MovieService 对网络接口进行请求这里写代码片

构建网络请求

public interface MovieService {
 @GET("top250")
 Call getTopMovie(@Query("start")int start, @Query("count")int count);
}
String baseUrl="https://api.douban.com/v2/movie/";
  Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(baseUrl)
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .build();
  MovieService service = retrofit.create(MovieService.class);
  service.getTopMovie(0,10)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber() {
     @Override
     public void onCompleted() {
      Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show();
     }

     @Override
     public void onError(Throwable e) {
      resultTV.setText(e.getMessage());
     }

     @Override
     public void onNext(MovieBean movieBean) {
      resultTV.setText(movieBean.getTitle());
     }
    });
  Call call = service.getTopMovie(0, 10);
  call.enqueue(new Callback() {
   @Override
   public void onResponse(Call call, Response response) {
    MovieBean body = response.body();
    resultTV.setText(response.body().getTitle());
    System.out.println("成功"+response.body().getCount());
   }

   @Override
   public void onFailure(Call call, Throwable t) {
    resultTV.setText(t.getMessage());
   }
  });

现在看看我们的布局文件MainActivity的xml




 

接下来就看看怎么样和RxJava的完美结合了。

首先改造一下MovieService这个接口

public interface MovieService {
 @GET("top250")
 Observable getTopMovie(@Query("start")int start, @Query("count")int count);
}

然后看一下我们需要创建一个HttpMethods关于一个http的请求方法

package ledon.com.retrofitdemo.api;

import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.security.auth.Subject;

import ledon.com.retrofitdemo.MovieBean;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;



public class HttpMethods {
 public static final String base_URL="https://api.douban.com/v2/movie/";
 private static final int DEFAULT_TIMEOUT=5;
 private Retrofit retrofit;
 private MovieService movieService;
 //私有化构造方法
 private HttpMethods(){
  //手动创建一个okhttpClient并设置超时时间
  OkHttpClient.Builder builder = new OkHttpClient.Builder();
  builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
  retrofit=new Retrofit.Builder()
    .client(builder.build())
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .baseUrl(base_URL)
    .build();
  movieService = retrofit.create(MovieService.class);


 }
 //在访问httpmethods时候创建单例
 private static class SingletonHolder{
  private static final HttpMethods INSTANCE=new HttpMethods();
 }
  //获取单例
 public static HttpMethods getInstance(){
  return SingletonHolder.INSTANCE;
 }
 public void getTopMovie(Subscribersubscriber, int start, int count){
  movieService.getTopMovie(start, count)
    .subscribeOn(Schedulers.io())
    .unsubscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(subscriber);

 }

}

so,很简单,我们的结合之路已经完成,另附源代码

package ledon.com.retrofitdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import ledon.com.retrofitdemo.adapter.MovieAdapter;
import ledon.com.retrofitdemo.api.HttpMethods;
import rx.Subscriber;

public class MainActivity extends AppCompatActivity {



 @Bind(R.id.click_me_BN)
 Button clickMeBN;
 @Bind(R.id.result_TV)
 ListView resultTV;
 @Bind(R.id.activity_main)
 RelativeLayout activityMain;
 private Subscriber subscriber;
 private List list;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  ButterKnife.bind(this);

  //resultTV.setAdapter();

 }


 //进行网络请求
 private void getMovie() {
  subscriber = new Subscriber() {
   @Override
   public void onCompleted() {
    Toast.makeText(MainActivity.this, "Get Top Movie Completed", Toast.LENGTH_SHORT).show();
   }

   @Override
   public void onError(Throwable e) {
    //resultTV.setText(e.getMessage());
   }

   @Override
   public void onNext(MovieBean movieBean) {
    // List subjects = movieBean.getSubjects();
    list=movieBean.getSubjects();
    MovieAdapter movieAdapter=new MovieAdapter(MainActivity.this,list);
    resultTV.setAdapter(movieAdapter);
    //resultTV.setText(movieBean.getTitle());
   }
  };
  HttpMethods.getInstance().getTopMovie(subscriber, 0, 10);
  
  //Call call = service.getTopMovie(0, 10);
  
 }

 @onClick(R.id.click_me_BN)
 public void onClick() {
  getMovie();
 }

}

package ledon.com.retrofitdemo;

import java.util.List;



public class MovieBean {

 

 private int count;
 private int start;
 private int total;
 private String title;
 private List subjects;

 public int getCount() {
  return count;
 }

 public void setCount(int count) {
  this.count = count;
 }

 public int getStart() {
  return start;
 }

 public void setStart(int start) {
  this.start = start;
 }

 public int getTotal() {
  return total;
 }

 public void setTotal(int total) {
  this.total = total;
 }

 public String getTitle() {
  return title;
 }

 public void setTitle(String title) {
  this.title = title;
 }

 public List getSubjects() {
  return subjects;
 }

 public void setSubjects(List subjects) {
  this.subjects = subjects;
 }

 public static class SubjectsBean {
  

  private RatingBean rating;
  private String title;
  private int collect_count;
  private String original_title;
  private String subtype;
  private String year;
  private ImagesBean images;
  private String alt;
  private String id;
  private List genres;
  private List casts;
  private List directors;

  public RatingBean getRating() {
   return rating;
  }

  public void setRating(RatingBean rating) {
   this.rating = rating;
  }

  public String getTitle() {
   return title;
  }

  public void setTitle(String title) {
   this.title = title;
  }

  public int getCollect_count() {
   return collect_count;
  }

  public void setCollect_count(int collect_count) {
   this.collect_count = collect_count;
  }

  public String getOriginal_title() {
   return original_title;
  }

  public void setOriginal_title(String original_title) {
   this.original_title = original_title;
  }

  public String getSubtype() {
   return subtype;
  }

  public void setSubtype(String subtype) {
   this.subtype = subtype;
  }

  public String getYear() {
   return year;
  }

  public void setYear(String year) {
   this.year = year;
  }

  public ImagesBean getImages() {
   return images;
  }

  public void setImages(ImagesBean images) {
   this.images = images;
  }

  public String getAlt() {
   return alt;
  }

  public void setAlt(String alt) {
   this.alt = alt;
  }

  public String getId() {
   return id;
  }

  public void setId(String id) {
   this.id = id;
  }

  public List getGenres() {
   return genres;
  }

  public void setGenres(List genres) {
   this.genres = genres;
  }

  public List getCasts() {
   return casts;
  }

  public void setCasts(List casts) {
   this.casts = casts;
  }

  public List getDirectors() {
   return directors;
  }

  public void setDirectors(List directors) {
   this.directors = directors;
  }

  public static class RatingBean {
   

   private int max;
   private double average;
   private String stars;
   private int min;

   public int getMax() {
    return max;
   }

   public void setMax(int max) {
    this.max = max;
   }

   public double getAverage() {
    return average;
   }

   public void setAverage(double average) {
    this.average = average;
   }

   public String getStars() {
    return stars;
   }

   public void setStars(String stars) {
    this.stars = stars;
   }

   public int getMin() {
    return min;
   }

   public void setMin(int min) {
    this.min = min;
   }
  }

  public static class ImagesBean {
   

   private String small;
   private String large;
   private String medium;

   public String getSmall() {
    return small;
   }

   public void setSmall(String small) {
    this.small = small;
   }

   public String getLarge() {
    return large;
   }

   public void setLarge(String large) {
    this.large = large;
   }

   public String getMedium() {
    return medium;
   }

   public void setMedium(String medium) {
    this.medium = medium;
   }
  }

  public static class CastsBean {
   

   private String alt;
   private AvatarsBean avatars;
   private String name;
   private String id;

   public String getAlt() {
    return alt;
   }

   public void setAlt(String alt) {
    this.alt = alt;
   }

   public AvatarsBean getAvatars() {
    return avatars;
   }

   public void setAvatars(AvatarsBean avatars) {
    this.avatars = avatars;
   }

   public String getName() {
    return name;
   }

   public void setName(String name) {
    this.name = name;
   }

   public String getId() {
    return id;
   }

   public void setId(String id) {
    this.id = id;
   }

   public static class AvatarsBean {
    

    private String small;
    private String large;
    private String medium;

    public String getSmall() {
     return small;
    }

    public void setSmall(String small) {
     this.small = small;
    }

    public String getLarge() {
     return large;
    }

    public void setLarge(String large) {
     this.large = large;
    }

    public String getMedium() {
     return medium;
    }

    public void setMedium(String medium) {
     this.medium = medium;
    }
   }
  }

  public static class DirectorsBean {
   

   private String alt;
   private AvatarsBeanX avatars;
   private String name;
   private String id;

   public String getAlt() {
    return alt;
   }

   public void setAlt(String alt) {
    this.alt = alt;
   }

   public AvatarsBeanX getAvatars() {
    return avatars;
   }

   public void setAvatars(AvatarsBeanX avatars) {
    this.avatars = avatars;
   }

   public String getName() {
    return name;
   }

   public void setName(String name) {
    this.name = name;
   }

   public String getId() {
    return id;
   }

   public void setId(String id) {
    this.id = id;
   }

   public static class AvatarsBeanX {
    

    private String small;
    private String large;
    private String medium;

    public String getSmall() {
     return small;
    }

    public void setSmall(String small) {
     this.small = small;
    }

    public String getLarge() {
     return large;
    }

    public void setLarge(String large) {
     this.large = large;
    }

    public String getMedium() {
     return medium;
    }

    public void setMedium(String medium) {
     this.medium = medium;
    }
   }
  }
 }
}

package ledon.com.retrofitdemo.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.baseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;

import ledon.com.retrofitdemo.MovieBean;
import ledon.com.retrofitdemo.R;



public class MovieAdapter extends baseAdapter {
 private Context context;
 private List lists;

 public MovieAdapter(Context context, List lists) {
  this.context = context;
  this.lists = lists;
 }

 @Override
 public int getCount() {
  System.out.println("集合大小:"+lists.size());
  return lists.size();
 }

 @Override
 public Object getItem(int i) {
  return null;
 }

 @Override
 public long getItemId(int i) {
  return 0;
 }

 @Override
 public View getView(int i, View convertView, ViewGroup viewGroup) {
  ViewHolder holder;
  if (convertView==null){
   convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
   holder=new ViewHolder();
   holder.tv_title= (TextView) convertView.findViewById(R.id.tv_title);
   holder.tv_name= (TextView) convertView.findViewById(R.id.tv_name);
   convertView.setTag(holder);
  }else {
   holder= (ViewHolder) convertView.getTag();
  }



  //MovieBean.SubjectsBean subjectsBean = lists.get(i).getSubjects().get(i);

  holder.tv_title.setText(lists.get(i).getTitle());
//  holder.tv_name.setText(lists.get(i).getCasts().get(i).getName());
  return convertView;
 }
 static class ViewHolder{
  TextView tv_title;
  TextView tv_name;
 }
}

package ledon.com.retrofitdemo.api;

import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.security.auth.Subject;

import ledon.com.retrofitdemo.MovieBean;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;



public class HttpMethods {
 public static final String base_URL="https://api.douban.com/v2/movie/";
 private static final int DEFAULT_TIMEOUT=5;
 private Retrofit retrofit;
 private MovieService movieService;
 //私有化构造方法
 private HttpMethods(){
  //手动创建一个okhttpClient并设置超时时间
  OkHttpClient.Builder builder = new OkHttpClient.Builder();
  builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
  retrofit=new Retrofit.Builder()
    .client(builder.build())
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .baseUrl(base_URL)
    .build();
  movieService = retrofit.create(MovieService.class);


 }
 //在访问httpmethods时候创建单例
 private static class SingletonHolder{
  private static final HttpMethods INSTANCE=new HttpMethods();
 }
  //获取单例
 public static HttpMethods getInstance(){
  return SingletonHolder.INSTANCE;
 }
 public void getTopMovie(Subscribersubscriber, int start, int count){
  movieService.getTopMovie(start, count)
    .subscribeOn(Schedulers.io())
    .unsubscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(subscriber);
  
 }
 private class HttpResultFunc implements Func1,T>{

  @Override
  public T call(HttpResult httpResult) {

   return httpResult.getSubjects();
  }
 }
}

package ledon.com.retrofitdemo.api;

import ledon.com.retrofitdemo.MovieBean;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;



public interface MovieService {
 @GET("top250")
 Observable getTopMovie(@Query("start")int start, @Query("count")int count);
}



 

 



感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/159432.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号