前言:

在平时项目开发中Okhttp3.x、Rxjava2.x、Retrofit2.x,使用的越来越多了,需要我们不断的去学习别人的优秀开发设计程序,今天简单的了解下

1,创建Android项目(Android studio)导入相关依赖

    implementation 'com.squareup.okhttp3:okhttp:3.11.0'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.5'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'

这里有网友提供的免费测试接口 http://gank.io/api/data/Android/10/1

2,定义接口类

package app.bxvip.com.rxjavaretrofit.imple;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
public interface MyApi {
  @GET("api/data/Android/10/1")
  Call<ResponseBody> getAndroidInfo();
    /**
     * 这里使用到了 Okhttp3 和retrofit2,我们通过导入的包就知道
     * 估计会有人对上面的写法表示不理解,接下来我们慢慢理解:
     * @GET 这个表示的是GET请求,想必不用不多说
     * "api/data/Android/10/1"可以理解为接口url, 一般url分为两个部分,前面一部分是不会变化的,就像前面提到的http://gank.io/api/data/Android/10/1这个接口
     * http://gank.io/这个是不会改变的,俗称baseurl,后面的就是接口url部分
     * Call<ResponseBody>是retrofit2中的对象,等会我们就知道他的用处
     */
}

3,发出请求,回调信息

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button bt_send;
    private TextView tv_result;
    public Retrofit retrofit;
    public  MyApi api;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt_send =findViewById(R.id.bt_send);
        tv_result =findViewById(R.id.result);
        bt_send.setOnClickListener(this);
        //实例化相关对象
        initObject();
    }

    private void initObject() {
    	//这里是构建对象,将之前的接口url和baseurl拼接
        retrofit = new Retrofit.Builder().baseUrl("http://gank.io/").build();
        api = retrofit.create(MyApi.class);
        
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.bt_send:
                send();
                break;
            default:
                break;
        }
    }

    private void send() {
    //发出请求,并接受回调信息
        Call<ResponseBody> call = api.getAndroidInfo();
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                Log.i("request return :","success");
                tv_result.setText(response.body().toString());
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.i("request return :","faild");
                tv_result.setText(t.getMessage());
            }
        });
    }
}

注意需要添加网络权限

 但是这样的话,看起来是不是结果太乱了,只知道返回了数据,乱七八糟的什么也看不出来,有没有办法让数据更工整点呢,GSON是一个神器

4,Rxjava 和 Retrofit的结合

//这里提供两个接口一个是天气接口,一个是豆瓣的接口
https://www.sojson.com/open/api/weather/json.shtml?city=广州
https://api.douban.com/v2/book/search?q=金瓶梅

1,通过GsonFormat插件创建两个对象WeatherBean和BookBean 

 2,编写访问的接口程序

	//接着上面的 MyApi后面继续写,这里是访问程序接口
    @GET("open/api/weater/json.shtml")
    Observable<WeatherBean> getWeather(@Query("city")String city);
	//@Query("city")String city是需要传递的参数用问好隔开
    @GET("book/search")
    Observable<BookBean> getBook(@Query("a")String name);

3,通过订阅连接观察者和被观察者

// Retrofit 通过okhttp访问接口
  Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://t.weather.sojson.com/api/weather/city/")
                .client(getOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        api = retrofit.create(MyApi.class);
 public OkHttpClient getOkHttpClient() {
        if (okHttpClient==null){
            okHttpClient = new OkHttpClient.Builder()
                    .retryOnConnectionFailure(true)
                    .connectTimeout(3000, TimeUnit.SECONDS)
                    .addInterceptor(new Interceptor() {
                        @Override
                        public okhttp3.Response intercept(Chain chain) throws IOException {
                            Request request = chain.request()
                                    .newBuilder()
                                    //删除原始的请求头
                                    .removeHeader("User-Agent")
                                    //添加新的 User-Agent
                                    .addHeader("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4)")
                                    .build();
                            return chain.proceed(request);
                        }
                    })
                    .build();

        }
        return okHttpClient;
    }
GsonConverterFactory
RxJava2CallAdapterFactory
//需要导入两个依赖
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'

4,通过Rxjava将访问到的结果发射出来

 private void sendWeather(){
        //返回的是一个Obserable对象
        api.getWeather("广州").subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<WeatherBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(WeatherBean weatherBean) {
                        Log.i("hb","ad" weatherBean.getCity());
                        if (weatherBean==null){
                            Log.i("hb",weatherBean.getCity());
                        }
                        //这里我们可以使用回调的方式,发给其他的类
                        //如 listern.send(weatherBean)
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i("hb",e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        Log.i("hb","sdf");
                    }
                });
    }

到此这篇关于Rxjava Retrofit Okhttp进行网络访问及数据解析的文章就介绍到这了,更多相关Rxjava网络访问内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Rxjava+Retrofit+Okhttp进行网络访问及数据解析的更多相关文章

  1. 使用Retrofit在Android中重新创建flask api调用

    我在服务器上有一个烧瓶app和api,它使用从终端发送的以下url我试图在Android上使用改造来重新创建它.我使用的是1.7版,因为这适用于此处未显示的一些遗留代码.这是应用程序类的相关部分和api类我现在只得到一般性错误,例如这是我的第一个烧瓶应用程序,我不完全确定如何调试所以任何帮助在这里也是赞赏.我也没有访问服务器日志更新为了尝试追踪问题,我编辑了服务器上的代码.如果我只是在api中返回

  2. android – 如何运行Travis-CI和Espresso Test

    我目前设置了Travis-CI,以便在我的Android设备的每个版本上运行gradleConnectedCheck任务并执行我的所有单元测试.我已经能够成功地设置它.我现在正在尝试用Espresso构建一些功能测试,我目前遇到很多困难,设置Travis的方式使我的espresso测试可以与Travis的模拟器交互.我如何设置Travis以使其模拟器的工作方式与我在本地工作站上使用的模拟器完全相同

  3. android – 如何使用Retrofit RX实现WebSocket

    我有一个使用RxRetrofit的项目结构.我想用它来实现WebSocket通信,任何想法我怎么能做到这一点?解决方法Retrofit尚不支持Web套接字.该功能预计将在2.1版本中发布.但是,JW一直致力于分支机构.您可以从hisbranch构建Retrofit并尝试它.或者可以等到2.1发布.这是Github上的相应issue.

  4. android – 使用改造下载图像文件

    解决方法问题是响应中的内容类型标头包含一个虚假的字符集:Retrofit看到了这一点,并推断响应是它可以记录的文本.您应该将问题报告给服务器的管理员.如果您将问题报告给GitHub上的Retrofit问题跟踪器,我们可能会从此问题中恢复而不是崩溃.

  5. android – 在Retrofit 2中上传文件

    我尝试了以下但是在响应时我得到500错误–帮助我在上面的屏幕截图中设计请求的界面…谢谢解决方法以下代码工作:)

  6. android – 带有@multipart的Retrofit @body有问题

    图像Multipart在类类型对象中.案例1.(我做过的)服务参数:那时我的改造API情况2.(我遇到问题)@Bodyclass我正在尝试这个APIJava方面我不知道为什么,但它返回错误,如:“@Bodyparameterscannotbeusedwithformormulti-partencoding”任何帮助,将不胜感激.解决方法简单来说,我这样做了:我改变

  7. 如何在不添加特定代码的情况下处理auth0 403错误(Retrofit / okhttp / RxAndroid)

    我正在使用Auth0,它给了我一个JWT和一个refreshtoken.我在http标头中使用此JWT与我的后端进行通信.当它确定JWT已经过期时,服务器可能会给我一个403.在这种情况下,我可以让Auth0使用refreshtoken向我发出一个新的JWT.这意味着我调用Auth0后端,将其传递给refreshtoken,它给了我一个新的JWT,然后我可以在我的请求中使用它.我的问题是,如何在我的所有网络代码中有效地编写此行为?

  8. 如何使用RxAndroid和Retrofit 2检索响应体?

    有没有其他方法可以从Observable获取响应字符串?

  9. android – Dagger Retrofit动态URL

    问题我需要从USER输入的域中调用API,我需要在调用插入数据之前编辑我的Retrofit单例.有没有办法“重置”我的单身人士,迫使它重新创建?要么有没有办法在调用之前用我的数据更新我的baseUrl?

  10. android – MockWebServer和带回调的Retrofit

    我想模拟MockWebServer的网络通信.不幸的改造回调永远不会被调用.我的代码:当我在没有回调的情况下使用改装时,它可以工作.解决方法通过使用Callback,您可以告诉Retrofit调用请求并异步调用回调.这意味着您的测试在任何事情发生之前就会退出.有两种方法可以使其工作:>在测试结束时使用锁并等待,直到调用其中一个回调方法.>将同步Executor的实例(只是立即调用.run()的实例

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部