Retrofit2总结一:
利用Retrofit2进行安卓中的各种网络处理,包含get、post、上传、下载等等一系列的处理。会结合Rxjava一起使用,本次总结只是最常用的get请求。结合一个小例子来实现。
依赖很重要:
第一个是retrofit+gson 下面3个全部是Rxjava的依赖
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'io.reactivex:rxjava:1.1.9'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
然后是布局,也很简答:
上面两个listViw 分别展示的是只使用retrofit 和 retrofit+rxjava 两种处理后的结果
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zgcw.wangqiang.retrofitdemo.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:gravity="center_vertical"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:background="@null"
android:visibility="gone"
android:layout_gravity="center"
android:id="@+id/button_refresh"
android:text="网络异常,暂无数据,点击刷新"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBar"
android:visibility="gone"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
</LinearLayout>
数据是聚合api的免费接口:"http://v.juhe.cn/toutiao/index?type=top&key= 6d130e4d5c6616611808542db929db1c "
先写实体类:
package com.zgcw.wangqiang.retrofitdemo;
import java.util.List;
/**
* Created by wangqiang on 16/8/15.
*/
public class News {
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;
}
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 title;
private String date;
private String author_name;
private String thumbnail_pic_s;
private String thumbnail_pic_s02;
private String thumbnail_pic_s03;
private String url;
private String uniquekey;
private String type;
private String realtype;
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 getAuthor_name() {
return author_name;
}
public void setAuthor_name(String author_name) {
this.author_name = author_name;
}
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;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUniquekey() {
return uniquekey;
}
public void setUniquekey(String uniquekey) {
this.uniquekey = uniquekey;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getRealtype() {
return realtype;
}
public void setRealtype(String realtype) {
this.realtype = realtype;
}
}
}
}
然后定义接口,如果你知道
retrofit的话 ,这些步骤你应该都知道
package com.zgcw.wangqiang.retrofitdemo;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;
/**
* Created by wangqiang on 16/8/15.
*/
public interface Service {
@GET("toutiao/index")
Call<News> getInfo(@Query("type") String type, @Query("key") String key);
@GET("toutiao/index")
Observable<News> getData(@Query("type") String type, @Query("key") String key);
}
接下来是主Activity
package com.zgcw.wangqiang.retrofitdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView mTextView, mTextView2;
private Button mButton;
private static final String TAG = "MainActivity";
private static final String ENDPOINT = "http://v.juhe.cn/";
private Retrofit retrofit = null;
private Call<News> serviceInfo;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
mTextView = (TextView) findViewById(R.id.textView);
mTextView2 = (TextView) findViewById(R.id.textView2);
mButton = (Button) findViewById(R.id.button_refresh);
mButton.setOnClickListener(this);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
}
private void initData() {
retrofit = new Retrofit.Builder()
.baseUrl(ENDPOINT)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
Service service = retrofit.create(Service.class);
//retrofit2实现方式
serviceInfo = service.getInfo("top", "6d130e4d5c6616611808542db929db1c");
serviceInfo.enqueue(new Callback<News>() {
@Override
public void onResponse(Call<News> call, Response<News> response) {
if (response.isSuccessful() && response.body() != null) {
mProgressBar.setVisibility(View.GONE);
mButton.setVisibility(View.GONE);
News.ResultBean.DataBean dataBean = response.body().getResult().getData().get(0);
mTextView.setText(dataBean.getTitle());
}
}
@Override
public void onFailure(Call<News> call, Throwable t) {
t.printStackTrace();
mButton.setVisibility(View.VISIBLE);
}
});
//retrofit2+RxJava实现方式
service.getData("top", "6d130e4d5c6616611808542db929db1c")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<News>() {
@Override
public void onCompleted() {
mProgressBar.setVisibility(View.GONE);
}
@Override
public void onError(Throwable e) {
Log.i(TAG, e.getMessage());
mButton.setVisibility(View.VISIBLE);
}
@Override
public void onNext(News news) {
mProgressBar.setVisibility(View.VISIBLE);
mButton.setVisibility(View.GONE);
News.ResultBean.DataBean dataBean1 = news.getResult().getData().get(0);
mTextView2.setText(dataBean1.getAuthor_name());
}
});
}
@Override
protected void onStop() {
super.onStop();
serviceInfo.cancel();
}
//点击刷新,加载数据
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_refresh:
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
initData();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
break;
}
}
}
两种实现方式这样就写完了!经测试,没有问题,数据可以正常显示!