• 【Android


    前几天分别对Retrofit和RxJava进行了总结,这个帖子打算把Retrofit结合RxJava使用的方法总结以下。有还不了解Retrofit或RxJava的朋友可以参考下面的帖子学习~

    【Android - 框架】之Retrofit的使用

    【Android - 框架】之RxJava的使用

    首先导入依赖:

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:24.2.1'
        testCompile 'junit:junit:4.12'
        compile 'com.squareup.retrofit2:retrofit:2.1.0'
        compile 'com.squareup.retrofit2:converter-gson:2.1.0'
        compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
        compile 'io.reactivex:rxjava:1.2.2'
        compile 'io.reactivex:rxandroid:1.2.1'
    }

    然后添加权限:

    <uses-permission android:name="android.permission.INTERNET" />

    在贴出代码之前先声明一下,这个帖子里面用到的案例和Retrofit的帖子中用到的案例是同一个。

    代码:

    两者结合的代码(未封装):

            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(SharedData.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .build();
    
            RetrofitService service = retrofit.create(RetrofitService.class);
    
            Observable<InfoData> observable = service.getInfoData();
    
            observable
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Subscriber<InfoData>() {
                        @Override
                        public void onCompleted() {
                        }
    
                        @Override
                        public void onError(Throwable e) {
                        }
    
                        @Override
                        public void onNext(InfoData infoData) {
                            Toast.makeText(MainActivity.this, infoData.getName(), Toast.LENGTH_SHORT).show();
                        }
                    });

    两者结合的代码(封装):

    封装好的工具类:

    import com.example.itgungnir.testretrofit_rxjava.share.SharedData;
    
    import retrofit2.Retrofit;
    import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
    import retrofit2.converter.gson.GsonConverterFactory;
    import rx.Observable;
    import rx.Subscriber;
    import rx.android.schedulers.AndroidSchedulers;
    import rx.schedulers.Schedulers;
    
    /**
     * 网络访问的工具类
     */
    public class HttpUtil {
        private static HttpUtil instance;
    
        private Retrofit retrofit;
    
        private HttpUtil() {
            this.instance = this;
            this.retrofit = new Retrofit.Builder()
                    .baseUrl(SharedData.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .build();
        }
    
        private static HttpUtil getInstance() {
            if (instance == null) {
                synchronized (HttpUtil.class) {
                    if (instance == null) {
                        return new HttpUtil();
                    }
                }
            }
            return instance;
        }
    
        public static <T> T getService(Class<T> c) {
            return getInstance().retrofit.create(c);
        }
    
        public static <T> void init(Observable<T> observable, Subscriber<T> subscriber) {
            observable
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(subscriber);
        }
    }

    在主线程中调用工具类:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            HttpUtil.init(HttpUtil.getService(RetrofitService.class).getInfoData(), new Subscriber<InfoData>() {
                @Override
                public void onCompleted() {
                }
    
                @Override
                public void onError(Throwable e) {
                }
    
                @Override
                public void onNext(InfoData infoData) {
                    Toast.makeText(MainActivity.this, infoData.getName(), Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    运行结果:

  • 相关阅读:
    关于 a 标签 jquery的trigger("click"),无法触发问题。
    浏览器上传文件,存到oracle数据库示例。
    关于java的Long 类型到js丢失精度的问题
    java 自定义注解,并使用示例
    关于重置功能(type="reset")的相关问题
    校验键盘上中英文状态下所有的特殊字符(排除下划线所在的按键)
    VS Code 设置取消打开文件目录的自动定位跟踪功能。
    $.extend(x,y); 函数用法介绍。
    用jquery的.val() 给具有style="display:none;" 属性的标签写值的问题。
    10.我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6210850.html
Copyright © 2020-2023  润新知