Retofit + RxJava 请求数据

来源:互联网 发布:网络图标不见了 编辑:程序博客网 时间:2024/05/17 07:49

这一篇文章给大家介绍现在非常火的一种网络请求数据的方式: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的一样在这里就不一一展示了

其实这篇文字与上篇写的一样就是换了个请求网络的框架。好了,就写到这里,多多支持,谢谢大家!!!