这一篇文章给大家介绍现在非常火的一种网络请求数据的方式:Retofit + RxJava
前几篇介绍到了Retofit 和RxJava,现在就给大家直接上代码了,也是非常简单的。
具体使用
1.添加依赖
compile 'com.squareup.retrofit2:retrofit:2.0.2'
// Retrofit库
compile 'com.squareup.okhttp3:okhttp:3.1.2'
// Okhttp库
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
//gson解析器
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
//Retrofit支持Rxjava
2.添加权限
<uses-permission android:name="android.permission.INTERNET"/>
3.实现代码:
MainActivity的xml文件:<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="liuhao.baway.com.retrofitandrxjava.MainActivity">
<TextView
android:id="@+id/textview"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示获取的数据" />
</RelativeLayout>
MainActivity页面的实现逻辑:
记住写代码的时候要时常注意,千万不要导错包,要不你会很不好找错。
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.textview);
RetrofitUntils.getRetrofitUntils(this).get("106", new NetClickListener() {
@Override
public void Suesses(BaseBean baseBean) {
if(baseBean.getCode().equals("0")){
tv.setText(baseBean.getMsg());
}
}
@Override
public void Error(String msg) {
Toast.makeText(MainActivity.this, msg,Toast.LENGTH_SHORT).show();
}
});
}
}
请求网络所用到的网络请求数据的封装类,在这里我用到了单例模式,保证使用唯一的实例。
import android.content.Context;
import okhttp3.OkHttpClient;
import retrofit2.GsonConverterFactory;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Created by 15218 on 2017/11/5.
*/
public class RetrofitUntils {
private static RetrofitUntils retrofitUntils;
private Context context;
private RetrofitUntils(Context context){
this.context = context ;
}
public static RetrofitUntils getRetrofitUntils(Context context){
if(retrofitUntils==null){
synchronized (RetrofitUntils.class){
if(retrofitUntils==null){
retrofitUntils = new RetrofitUntils(context);
}
}
}
return retrofitUntils ;
}
public void get(String uid, final NetClickListener netClickListener){
OkHttpClient.Builder ok = new OkHttpClient.Builder();
ok.addInterceptor(new LogInterceptor());
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://120.27.23.105/")//这里的url与实现接口中的url拼接成一个完整的URL
.client(ok.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
retrofit.create(Retrofit_Interface.class).getBean(uid)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<BaseBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if(netClickListener!=null){
netClickListener.Error(e.getMessage().toString());
}
}
@Override
public void onNext(BaseBean baseBean) {
if(baseBean.getCode().equals("0")){
if(netClickListener!=null){
netClickListener.Suesses(baseBean);
}
}
}
});
}
}
请求对象的接口:
import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;
/**
* Created by 15218 on 2017/11/5.
*/
public interface Retrofit_Interface {
@GET("product/getCarts")//在这里我们用到了Retrofit的get请求
Observable<BaseBean> getBean(@Query("uid") String uid);
//正常网络请求用Call就可以了,但是我们是和Rxjava结合一起使用,所以使用被观察者对象
}
其它的回调接口,bean对象,log日志打印拦截器,都与上篇
OKHttp + RxJava的一样在这里就不一一展示了
其实这篇文字与上篇写的一样就是换了个请求网络的框架。好了,就写到这里,多多支持,谢谢大家!!!