这是一篇浅显的Rxjava+Retrofit文章,从初学者出发,感觉如果工作中没有充足发挥自学技能的项目,直接去看大佬们写的很深入的讲解,特别容易遗忘、懵甚至不理解,所以我决定写一篇浅显的使用Rxjava+Retrofit的文章。
我访问的是“聚合数据”提供的新闻头条链接(“http://v.juhe.cn/toutiao/index?type=top&key=28aa4ac2a689c881a4e6e51cf918d695”)
1.添加依赖库
/*retrofit2*/ implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' implementation 'com.squareup.retrofit2:retrofit:2.0.2' implementation 'com.squareup.retrofit2:converter-gson:2.0.2' implementation 'com.squareup.okhttp3:okhttp:3.3.0' implementation 'com.squareup.okio:okio:1.7.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.2.0' implementation 'io.reactivex:rxandroid:1.1.0' implementation 'io.reactivex:rxjava:1.1.0' implementation'com.squareup.retrofit2:retrofit:2.1.0' implementation'com.squareup.retrofit2:adapter-rxjava:2.1.0' /*retrofit2*/
2.创建bean(此为请求数据为json的实体类)
import java.util.List;
/**
* 作者:Android
* 时间:2018/9/12 15:55
* 功能:
*/
public class RetrofitRxjavaResult {
private String reason;//成功的返回
private ResultBean result;
private int error_code;
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public ResultBean getResult() {
return result;
}
public void setResult(ResultBean result) {
this.result = result;
}
public int getError_code() {
return error_code;
}
public void setError_code(int error_code) {
this.error_code = error_code;
}
@Override
public String toString() {
return "RetrofitRxjavaResult{" +
"reason='" + reason + '\'' +
", result=" + result +
", error_code=" + error_code +
'}';
}
public static class ResultBean {
private String stat;
private List<DataBean> data;
public String getStat() {
return stat;
}
public void setStat(String stat) {
this.stat = stat;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
private String uniquekey;
private String title;
private String date;
private String category;
private String author_name;
private String url;
private String thumbnail_pic_s;
private String thumbnail_pic_s02;
private String thumbnail_pic_s03;
public String getUniquekey() {
return uniquekey;
}
public void setUniquekey(String uniquekey) {
this.uniquekey = uniquekey;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getAuthor_name() {
return author_name;
}
public void setAuthor_name(String author_name) {
this.author_name = author_name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getThumbnail_pic_s() {
return thumbnail_pic_s;
}
public void setThumbnail_pic_s(String thumbnail_pic_s) {
this.thumbnail_pic_s = thumbnail_pic_s;
}
public String getThumbnail_pic_s02() {
return thumbnail_pic_s02;
}
public void setThumbnail_pic_s02(String thumbnail_pic_s02) {
this.thumbnail_pic_s02 = thumbnail_pic_s02;
}
public String getThumbnail_pic_s03() {
return thumbnail_pic_s03;
}
public void setThumbnail_pic_s03(String thumbnail_pic_s03) {
this.thumbnail_pic_s03 = thumbnail_pic_s03;
}
}
}
}
3.Retrofit与Rxjava结合的类
package com.example.androidvideo.activity;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;
import com.example.androidvideo.R;
import com.example.androidvideo.adpater.MyListViewAdapter;
import com.example.androidvideo.bean.RetrofitRxjavaResult;
import com.example.androidvideo.interfaces.NewsService;
import com.example.androidvideo.utils.LogUtils;
import com.example.androidvideo.utils.ToastUtils;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Observer;
import rx.Scheduler;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* 作者:Android
* 时间:2018/9/12 15:51
* 功能:Retrofit和Rxjava的网络请求
*/
public class RetrofitRxjavaActivity extends Activity {
private static final String TAG = RetrofitRxjavaActivity.class.getSimpleName();
private static final long TIMEOUT = 5000;
private static final String BASE_URL = "http://v.juhe.cn/toutiao/";
private ListView listView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_retrorxjava);
initView();
requestServer();
}
private void initView() {
listView = (ListView) findViewById(R.id.listView);
}
/**
* 请求网络
*/
private void requestServer() {
/*OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {//添加网络访问Header
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
builder.addHeader("token", "123");
return chain.proceed(builder.build());
}
})
.addInterceptor(new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
//获取网络错误信息
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
}).setLevel(HttpLoggingInterceptor.Level.BASIC))
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)//链接超时
.readTimeout(TIMEOUT, TimeUnit.SECONDS)//读取超时
.build();*/
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(5000, TimeUnit.SECONDS)
.readTimeout(5000, TimeUnit.SECONDS)
.build();
Gson buildGson = new GsonBuilder()
.serializeNulls()
.setFieldNamingPolicy(FieldNamingPolicy.IDENTITY)
.create();
NewsService newsService = new Retrofit.Builder().baseUrl(BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加Rxjava支持
.addConverterFactory(GsonConverterFactory.create(buildGson))
.client(okHttpClient)
.build().create(NewsService.class);
Observable<RetrofitRxjavaResult> observable = newsService.getNews("top", "28aa4ac2a689c881a4e6e51cf918d695");
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<RetrofitRxjavaResult>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted() called");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError() called");
}
@Override
public void onNext(RetrofitRxjavaResult retrofitRxjavaResult) {
Log.d(TAG, "onNext:" + retrofitRxjavaResult);
if (retrofitRxjavaResult != null) {
RetrofitRxjavaResult.ResultBean result = retrofitRxjavaResult.getResult();
if (result != null) {
List<RetrofitRxjavaResult.ResultBean.DataBean> data = result.getData();
MyListViewAdapter adapter = new MyListViewAdapter(RetrofitRxjavaActivity.this, data);
listView.setAdapter(adapter);
}
} else {
ToastUtils.showText("服务器数据错误");
}
}
});
}
}
4.ListView的BaseAdapter
package com.example.androidvideo.adpater;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.example.androidvideo.R;
import com.example.androidvideo.bean.RetrofitRxjavaResult;
import com.example.androidvideo.customView.MyImageView;
import java.util.List;
/**
* 作者:Android
* 时间:2018/9/12 17:11
* 功能:ListView的适配器
*/
public class MyListViewAdapter extends BaseAdapter {
private final List<RetrofitRxjavaResult.ResultBean.DataBean> data;
private LayoutInflater mInflater;
public MyListViewAdapter(Context context, List<RetrofitRxjavaResult.ResultBean.DataBean> data) {
mInflater = LayoutInflater.from(context);
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return data.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int postion, View convertView, ViewGroup viewGroup) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null, false); //加载布局
holder = new ViewHolder();
holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);
holder.tvDate = (TextView) convertView.findViewById(R.id.tv_date);
holder.imageView = (MyImageView) convertView.findViewById(R.id.image_view);
convertView.setTag(holder);
} else { //else里面说明,convertView已经被复用了,说明convertView中已经设置过tag了,即holder
holder = (ViewHolder) convertView.getTag();
}
RetrofitRxjavaResult.ResultBean.DataBean bean = data.get(postion);
holder.tvTitle.setText(bean.getTitle());
holder.tvDate.setText(bean.getDate());
holder.imageView.setImageURL(bean.getThumbnail_pic_s());
return convertView;
}
private class ViewHolder {
MyImageView imageView;
TextView tvTitle;
TextView tvDate;
}
}
整理,作为笔记。
本文详细介绍如何结合RxJava与Retrofit实现网络请求,并通过具体案例解析数据获取及UI更新流程。
2052

被折叠的 条评论
为什么被折叠?



