Retrofit2+Rxjava+OkHttp的使用和网络请求

Retrofit+OKHttp+RxJava的使用 响应式编程是一种基于异步数据 流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一 条流合并为一条新的流。RxJava 是一种响应式编程,来创建基于事件的异步操作库。基于事件流的链式调用、逻辑清晰简洁。RxJava 我的理解是将事件从起点(上游)流向终点(下游),中间有很多卡片对数据进操作并传 递,每个卡片获取上一个卡片传递下来的结果然后对事件进行处理然后将结果传递给下一个卡片, 这样事件就从起点通过卡片一次次传递直到流向终点。... 阅读详情

首先介绍Retrofit: Retrofit是Square 公司开发的一款正对Android 网络请求的框架。底层基于OkHttp 实现。版本要求至少需要java7或者Android2.3。
github地址


使用
在项目的build.gradle下dependencies下添加:

compile 'com.squareup.retrofit2:retrofit:2.1.0'

创建retrofit 实例

        String Basrurl = "Https://api.douban.com/v2/movie/";
        //Basrurl 代表服务器根地址
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Basrurl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

Retrofit2的baseurl必须要以斜线结束,不然会抛出一个IllegalArgumentException。
添加一个factory 来响应返回数据进行序列化解析。这里添加Gson解析。
在你项目的build.gradle上的dependencies下加入:

compile 'com.squareup.retrofit2:converter-gson:2.1.0'

还有其他converter如下:

Gson: com.squareup.retrofit2:converter-gson

Jackson: com.squareup.retrofit2:converter-jackson

Moshi: com.squareup.retrofit2:converter-moshi

Protobuf: com.squareup.retrofit2:converter-protobuf

Wire: com.squareup.retrofit2:converter-wire

Simple XML: com.squareup.retrofit2:converter-simplexml

定义接口.
在retrofit2中,端口是定义在一个interface里面的,通过注解来映射参数以及请求类型或者请求头等细节。另外返回值都是一个被参数化得Call< T >对象。

public interface HttpInterface {

   /**
     * @param start 开始位置
     * @param count 数量
     * @return 
     */
    @GET("top250")
    Call<Object> getMovie(@Query("start") int start,
                            @Query("count") int count);
}

各种注解含义(主要解释GET和POST两种):
@Query
用于GET请求参数传递

@GET("login/users")
Call<List<User>> checkLogin(@Query("id") int useId);

等同于:url后面接?加参数的K-V值

@GET("loger/users?id=useId")

@QueryMap
用于GET多参数集成一个Map统一上传

    @GET("movie/search")
    Call<MovieSearchEntity> getSearchMovies(@Query("type") String type,
                                 @QueryMap Map<String, String> params);

调用时候将多个参数存入一个map里面一起调用,如下:

Map<String, String> params= new HashMap<>();
map.put("name", "星际");
map.put("time", null);
map.put("start", "0");
map.put("count", "5");
Call<MovieSearchEntity> call = httpService.getSearchMovies("科幻",params);

等同于:

@GET("movie/search?type=科幻"&name=星际&start=0&count=5)

@Path
用于url上的占位符,可以用双大括号包裹,参数中替换,可用于任何请求方式中。如下:

@GET("movie/{id}")
Call<MovieEntity> getMovie(@Path("id") String id);

根据不同的id得到的数据也不同。可以动态传递,比如调用:

Call<BookResponse> call = mBlueService.httpService("123456");

相对与请求以下@GET

@GET("movie/123456")

@field
用于post请求,post请求需要把参数放置在请求体中,并非是拼接在url后面:

    @POST("user/login")
    @FormUrlEncoded
    Call<Object> login(@Field("usename") String usename,
                       @Field("password") String password);

@FormUrlEncoded是会自动将请求参数的类型调整为表单类型application/x-www-form-urlencoded,不能用于GET请求,如果不用传递参数可以不用加。

@Field注解是将每个请求参数都存在请求体中,还可以添加encoded参数,该参数为boolean型,比如:

@Field(value = "usename",encoded = ture) String usename

encoded参数为true的话,key-value-pair将会被编码,即将中文和特殊字符进行编码转换。

@Body
用于POST请求,可以将实例对象转换为对应的字符串传递参数,如果在Retrofit初始化时候添加了GsonConverterFactory,则是将body转换为gson字符进行串传递的,其他Converter大同小异。如下:

    @POST("user/login")
    @FormUrlEncoded
    Call<String> loginTestBody(@Body LoginEntity loginEntity);

    public class LoginEntity {
        public String usename;
        public String password;
        public String vip;
        public String money;
    }

@Part
用于文件的上传,这里先不介绍

@Headers
Retrofit提供了两种定义Http请求头的参数:静态和动态。静态方法在头部信息初始化的时候已经固定写死了,而动态方法则必须为每个请求单独设置。
静态设置:

    @Headers("User-Agent: android")
    @POST("login")
    @FormUrlEncoded
    Call<Object> login1(@Field("usename") String usename,
                       @Field("password") String password);

添加多个header参数也可以,类似数组:

@Headers({"User-Agent: android"
                ,"Cache-Control: max-age=640000"})
    @POST("login")
    @FormUrlEncoded
    Call<Object> login1(@Field("usename") String usename,
                       @Field("password") String password);

静态也可以设置okhttp的拦截器去添加头布局:

 okHttpClient = new OkHttpClient.Builder()
       .addInterceptor(new Interceptor() {
      @Override
       public Response intercept(Chain chain) throws IOException {
            Request request = chain.request()
              .newBuilder()
              .addHeader("userDeviceID", MyApplication.DEVICETOKEN)
              .header("User-Agent", "android-27")
              .build();
              return chain.proceed(request);
       }
   })
   .cookieJar(new CookiesManager())
   .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)//设置读取超时时间
   .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)//设置写的超时时间
   .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
   .build();

需要注意的是,addHeader是可以存在相同的key值,而header则是覆盖重复的。
设置好OkHttp后在Retrofit中client加入okHttpClient

retrofit = new Retrofit.Builder()
    .client(okHttpClient)                
    .addConverterFactory(GsonConverterFactory.create())
    .baseUrl(baseUrl)
    .build();

动态设置:

 @POST("login")
    @FormUrlEncoded
    Call<Object> login2(@Header("User-Agent") String userAgent,
                        @HeaderMap Map<String,String> headers,
                        @Field("usename") String usename,
                        @Field("password") String password);

@Url
需求总是变化的,如果需要请求的地址不是以baseUrl开头的话,就需要使用这个注解,直接请求完整的url,忽视baseurl:

    @POST
    @FormUrlEncoded
    Call<Object> login3(@Url String url,
                        @Field("usename") String usename,
                        @Field("password") String password);

@Streaming
大文件下载的时候,同个该注解,防止直接写入内存中。比如app更新时候,下载music的时候。

    @Streaming
    @GET
    Observable<ResponseBody> download(@Header("RANGE") String start, @Url String url);

前面Retrofit的各种参数讲的差不多了,都不知道刚开始讲的是什么(手动滑稽)
上面讲了创建Retrofit的实例,创建了请求接口。通过retrofit动态代理拿到接口对象的实例:

        String Basrurl = "Https://api.douban.com/v2/movie/";
        //Basrurl 代表服务器根地址
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Basrurl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        httpInterface = retrofit.create(HttpInterface.class);

拿到getMovie返回的Call对象:

Call<Object> movie = httpInterface.getMovie(0, 10);

执行enqueue(可以链式连写):

movie.enqueue(new Callback<Object>() {
            @Override
            public void onResponse(Call<Object> call, Response<Object> response) {
                Object body = response.body();
                body.toString();
                Log.e("TAG",body.toString());
                try {
                    Gson gson = new Gson();
                    String str = gson.toJson(body);
                    JSONObject jsonObject = new JSONObject(str);
                    JSONArray subjectsArray = jsonObject.optJSONArray("subjects");
                    for(int i = 0;i < subjectsArray.length(); i++){
                        JSONObject jsonChild = subjectsArray.getJSONObject(i);
                        String title = jsonChild.optString("title");
                       Log.e("TAG","TOP250电影第"+(i+1)+"的名字:  "+title);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<Object> call, Throwable t) {

            }
        });

这里简单的请求就完成了,这里是打印出来的,没有界面,比较懒。
Call对象还可以执行取消操作,当网络请求还没有完成的时候取消:

call.cancel();

这里写图片描述

是不是觉得很麻烦,还要一层层的解析。是的,既然是泛型,为何不加入实体类就行了嘛。加入泛型改动如下:
实体类Movie250Modle实现Serializable接口,完成序列化操作。
接口添加泛型:

    @GET("top250")
    Call<Movie250Modle> getMovie(@Query("start") int start,
                                 @Query("count") int count);

请求时回调会自动加入泛型,如下:

String Basrurl = "Https://api.douban.com/v2/movie/";
        //Basrurl 代表服务器根地址
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Basrurl)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        httpInterface = retrofit.create(HttpInterface.class);

        Call<Movie250Modle> movie = httpInterface.getMovie(0, 10);
        movie.enqueue(new Callback<Movie250Modle>() {
            @Override
            public void onResponse(Call<Movie250Modle> call, Response<Movie250Modle> response) {
                Movie250Modle movie250Modle = response.body();
                List<Movie250Modle.SubjectsBean> movie250ModleSubjects = movie250Modle.getSubjects();
                for(int i = 0; i < movie250ModleSubjects.size(); i++){
                    Log.e("TAG","实体类TOP250电影第"+(i+1)+"的名字:  "+movie250ModleSubjects.get(i).getTitle());
                }
            }

            @Override
            public void onFailure(Call<Movie250Modle> call, Throwable t) {

            }
        });

看看结果也是一样的:
这里写图片描述


添加OkHttp参数
你们所知道的,retrofit2内部网络请求使用的就是okhttp,光是用上面的retrofit2往往是不够全面的,还需要添加okhttp参数:

 /**
         * addInterceptor   设置拦截器
         * cookieJar    设置cook管理类
         * readTimeout   设置读取超时时间
         * writeTimeout  设置写的超时时间
         * connectTimeout  设置链接超时时间
         * retryOnConnectionFailure 设置是否重试链接
         */
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new MyInterceptor())
                .cookieJar(new CookiesManager())
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(10,TimeUnit.SECONDS)
                .connectTimeout(10,TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                .build();

前面讲了
cookieJar 是cook持久化管理,用于免登陆使用
addInterceptor是前面设置header用过的,可以添加一些参数:

class MyInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        HttpUrl httpUrl = request.url()
                .newBuilder()
                // add common parameter
                .addQueryParameter("token", "123")
                .addQueryParameter("username", "tt")
                .build();
        Request build = request.newBuilder()
                // add common header
                .addHeader("contentType", "text/json")
                .url(httpUrl)
                .build();
        Response response = chain.proceed(build);
        return response;
    }
}

在retrofit创建的时候加入client:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Basrurl)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

这样就设置好了okhttp的参数

网络日志
okhttp支持网络请求的信息打印,这样更方便查看网络请求信息。在项目中build.gradle文件中引入logging-interceptor:

compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

在初始化okhttp时候加入:

HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        /**
         * addInterceptor   设置拦截器
         * addInterceptor   设置logg拦截器
         * cookieJar    设置cook管理类
         * readTimeout   设置读取超时时间
         * writeTimeout  设置写的超时时间
         * connectTimeout  设置链接超时时间
         * retryOnConnectionFailure 设置是否重试链接
         */
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new MyInterceptor())
                .addInterceptor(loggingInterceptor)
                .cookieJar(new CookiesManager())
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(10,TimeUnit.SECONDS)
                .connectTimeout(10,TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                .build();

没错HttpLoggingInterceptor也是implements Interceptor接口;loggingInterceptor其中包含了4个打印等级:在logcat用okhttp过滤信息
NONE
No logs,无信息
BASIC
/**
* Logs request and response lines and their respective headers.
*
* <p>Example:
* <pre>{@code
* --> POST /greeting http/1.1
* Host: example.com
* Content-Type: plain/text
* Content-Length: 3
* --> END POST
*
* <-- 200 OK (22ms)
* Content-Type: plain/text
* Content-Length: 6
* <-- END HTTP
* }</pre>
*/

打印请求类型,URL,请求体大小,返回值状态以及返回值的大小
具体例子:
这里写图片描述
HEADERS

 /**
     * Logs request and response lines and their respective headers.
     *
     * <p>Example:
     * <pre>{@code
     * --> POST /greeting http/1.1
     * Host: example.com
     * Content-Type: plain/text
     * Content-Length: 3
     * --> END POST
     *
     * <-- 200 OK (22ms)
     * Content-Type: plain/text
     * Content-Length: 6
     * <-- END HTTP
     * }</pre>
     */

打印返回请求和返回值的头部信息,请求类型,URL以及返回值状态码
这里写图片描述
BODY

 /**
     * Logs request and response lines and their respective headers and bodies (if present).
     *
     * <p>Example:
     * <pre>{@code
     * --> POST /greeting http/1.1
     * Host: example.com
     * Content-Type: plain/text
     * Content-Length: 3
     *
     * Hi?
     * --> END POST
     *
     * <-- 200 OK (22ms)
     * Content-Type: plain/text
     * Content-Length: 6
     *
     * Hello!
     * <-- END HTTP
     * }</pre>
     */

打印返回请求和返回值的头部信息,请求类型,URL以及返回值状态码以及Body信息(数据信息)
这里写图片描述


加入Rxjava
如果rxjava没学过的,可以看看这个大牛写的博客:
初学者Rxjava2教程
先引入rxjava全家桶,在项目build.gradle下加入:

    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.0.1'
    // 此处一定要注意使用RxJava2的版本
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

然后在Retrofit实例化加入addCallAdapterFactory

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Basrurl)
                .client(okHttpClient)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        httpInterface = retrofit.create(HttpInterface.class);

接口类中的修改,不能返回Call对象了,要返回被观察者,,观察者观察网络请求,将网络请求当做被观察者,完成一个异步操作。

/**
     * @param start 开始位置
     * @param count 数量
     * @return
     */
    @GET("top250")
    Observable<Movie250Modle> getMovie(@Query("start") int start,
                                       @Query("count") int count);

那么网络请求拿到的接口对象如下:

Flowable<Movie250Modle> movieObservable = httpInterface.getMovie(0, 10);

执行异步网络操作:

movieObservable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Movie250Modle>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Movie250Modle value) {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

等待,我们这里用的是rxjava2,所以对应被观察者(上游)Observable变成Flowable,下游Observer就变成了Subscriber,所以就变成如下:

 movieObservable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Movie250Modle>() {
                    @Override
                    public void onSubscribe(Subscription s) {

                    }

                    @Override
                    public void onNext(Movie250Modle movie250Modle) {

                    }

                    @Override
                    public void onError(Throwable t) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

subscribeOn(Schedulers.io())指定被观察者事件发生io线程,耗时操作
observeOn(AndroidSchedulers.mainThread())指定观察者事件发生在主线程,更新UI必须在主线程中。
subscribe(new Subscriber…..) 被观察者订阅观察者。


基本使用已经完成了,后续写下请求封装。

RxJava+Retrofit2+Okhttp3网络请求封装实践 Retrofit2是Square公司开发的一款类型安全的HTTP客户端,它允许开发者以声明式的方式定义HTTP请求的接口。通过将这些接口与Retrofit对象关联,可以轻松实现网络请求的发送和响应数据的解析。首先,要在项目中引入Retrofit2库。假设你使用Gradle作为构建工具,可以添加如下依赖到项目的build.gradle文件中:然后,创建一个Retrofit实例并配置好基础的URL和转换工厂(这里使用GsonFactory作为例子):.build(); 阅读详情

相关推荐

Android高效网络请求框架实战:Okhttp+Retrofit2+RxJava

在Android开发中,网络请求是构建高质量应用的核心环节。早期的和虽能实现基本功能,但在复杂业务场景下显得力不从心,存在代码冗余、维护困难、扩展性差等问题。随着移动互联网的发展,开发者对网络通信的效率、可维护性和可扩展性提出了更高要求。为此,OkHttp、Retrofit2和RxJava应运而生,构成了现代Android网络请求的黄金组合。OkHttp以其高性能、支持HTTP/2和连接复用等特性,成为底层网络通信的理想选择;

weixin_29885875的博客 485

OKHttp+RxJava+RxAndroid MVP详解

Android开发中常用的技术架构有三种,MVC,MVP,MVVM。具体讲解1. MVC M:Model:模型层主要用来获取数据,数据的来源包括接口获取,数据库获取,SharedPreferences获取等等途径。并将其解析成Bean对象回调给Controller层。 V:View:视图层主要用来绘制各个视图,即Activity/Fragment对应的布局XML文件。 C:Controller:控制层主要接收Model层的回调,控制View层的显示。

听海的博客 2250

Mac新手必看:用Homebrew安装wget的保姆级教程,附常见报错一键修复

本文为Mac新手提供使用Homebrew安装wget的详细教程,涵盖从Homebrew安装到wget基础使用的全流程,并附常见报错一键修复方案。通过本指南,用户可轻松掌握命令行下载工具wget的安装与使用技巧,解决Mac环境下资源下载的各种问题。

weixin_30635053的博客 367

安卓使用okhttp3+retrofit2+rxjava实现网络通信

最近做一个安卓应用,实现安卓端从服务器端获取电影列表的功能,于是自己搭建了asp.net服务端并实现安卓代码,之前就用这种方式实现安卓和服务器通信,但是之前后端使用java编写,通过这个应用才知道,okhttp还能和asp.net的服务端通信。本着分享精神和记录作用,本文分享如何使用okhttp3+retroft2+rxjava实现网络通信功能。

May-gemini的博客 1504

手教你如何使用Simulink和相关工具箱模拟和实现无人机的多机接力信号中继的建模

扩大通信范围:单架无人机的通信能力有限,通过多机接力的方式可以显著扩展通信覆盖范围。提高可靠性:当某架无人机出现故障或电量不足时,其他无人机可以接管其任务,确保通信不中断。适应复杂环境:在山区、森林等复杂地形中,多机接力可以绕过障碍物,建立稳定的通信链路。使用Communications Toolbox中的模块来模拟无线通信链路。例如,可以使用模块模拟噪声信道,或者使用模块计算信号衰减。matlab深色版本。

MHD0815的博客 767

避坑指南:OpenWebUI+SearXNG联网搜索的5个常见配置错误及解决方法

本文详细解析了OpenWebUI与SearXNG整合过程中常见的5个配置错误及解决方案,包括JSON格式配置陷阱、国内搜索引擎缺失、连续搜索失效等问题。通过实战验证的优化策略,帮助开发者避免性能下降和功能异常,提升大模型与搜索引擎的协同效率。

jenkins8butler的博客 819

老罗android rxjava,浅谈OkHttp以及Retrofit+RxJava的封装使用

1.为什么我们要使用OkHttp?OkHttp有什么优点?说OkHttp之前我们先说另外两个网络请求库——HttpUrlConnection和HttpClient。在没有OkHttp之前的日子里,他们才是Android用来完成网络请求的类库。那么这两者都有什么优缺点呢? 为什么不再继续使用下去呢?HttpClient是Apache基金会的一个开源网络库, 功能十分强大, API数量众多, 但是正是...

weixin_33435115的博客 734

chmod: changing permissions of `/u01/app/oracle/product/11.2.0/dbhome_1/bin/extjobO‘: Operation not

oracle 11.2.0.4安装psu 29141056,日志末尾抛出报错 Patching component oracle.ctx, 11.2.0.4.0... Applying sub-patch '29141056' to OH '/u01/app/oracle/product/11.2.0/dbhome_1' Patching component oracle.rdbms, 11.2.0.4.0... Patching component oracle.rdbms.rman, 11.2.0.

m0_37625564的博客 1833

android okhttp+RxJava+retrofit网络请求框架封装

android okhttp+RxJava+retrofit网络请求框架封装 android开发中,网络请求是必不可少的开发模块,所以对于网络请求的框架和封装在开发中就显得尤为重要,今天我这里就大概的描述下okhttp+rxJava+retrofit三者相结合网络请求的封装 一.okhttp+RxJava+Retrofit请求框架集成 在app的build.gradle中加入如下依赖 im...

cangahi09025566的博客 5847

猿创征文|SfM(Structure from Motion)学习之路

SfM全称Structure from Motion,译为运动恢复结构,是三维重建pipeline的一部分,又称稀疏重建,在摄影测量领域则称为空三(空中三角测量)。SfM的任务是,给定一系列具有一定重叠度的图像,去同时估计出拍摄每张图像时相机的的位姿(位置t和姿态R)和被拍摄物体或场景的稀疏点云。...............

zeeq的博客 1万+

YOLO26核心模块解析:SimSPPF轻量化空间金字塔池化的原理与优势详解

SimConv作为现代深度学习的基础构建块,其设计虽然简洁,但包含了多项关键技术的有机组合。通过将卷积、批量归一化和激活函数整合为统一模块,SimConv不仅提供了稳定的训练特性和良好的表达能力,还为后续更复杂网络架构的发展奠定了基础。SimConv的成功在于其体现了深度学习设计的核心理念:简洁性与有效性的平衡。它证明了通过合理的技术组合,可以在不显著增加复杂度的前提下大幅提升模型性能。随着深度学习技术的持续发展,SimConv及其变种将继续作为重要的基础组件,推动计算机视觉和人工智能技术的进步。

know_F0727的博客 2619

Android Retrofit2+Rxjava2+OKHttp3 网络请求框架 (一)

Android Retrofit+Rxjava+OKHttp 网络请求框架 (一retrofit 2.0)一、retrofit 2.0简介二、retrofit使用:Retrofit 集成retrofit注释:三、Okhttp新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你

LTFV5的博客 3446

YOLOv8改进,YOLOv8主干网络替换为ShuffleNetV2

ShuffleNet V2的设计原则:1.减少内存访问成本:通过优化数据传输路径,减少内存访问延迟,提高整体运算速度。2.考虑平台特性:针对不同硬件平台的特性进行优化设计,确保在目标平台上的高效运行。3.结构简洁高效:采用简洁而高效的模块设计,降低计算复杂度,同时保持或提升模型的预测准确性。下图,以四种不同计算复杂度水平下的准确性(在ImageNet验证集上的分类),速度和FLOPs的测量结果。(a, c) 为GPU结果,批量大小为8。(b, d) 为ARM结果,批量大小为1。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1567

简单实现RxJava2+Okhttp+Retrofit2的网络请求框架封装

简单实现RxJava2+Okhttp+Retrofit2的网络请求框架封装本人近期在看网络请求框架封装时,看到网上呼声最高的是此类,轻便有简介,近日闲来无事,就为各位农友写了个案例,抠脚来的不喜勿喷哦。简单实现RxJava2OkhttpRetrofit2的网络请求框架封装 OKhttp RxJava2 RetrofitRetrofit2的配置以及使用 Okhttp的配置以及使用 RxJava2的配置

8647

021、反激变换器的软启动设计

本文分享了反激变换器软启动设计的实践经验。作者通过一次上电炸机事故引出软启动的重要性,分析了启动瞬间电流冲击和环路饱和问题。介绍了三种软启动方案:效果差的RC电路、推荐使用的数字芯片方案以及分立元件实现方法,重点指出数字方案的一致性优势。文章还探讨了软启动与过流保护的配合问题,提供了实测波形、温度影响等调试要点,并总结出软启动时间选择、批量生产一致性等实用建议。最后强调软启动是电源可靠性的关键设计,不应为节省成本而忽略。全文包含多个工程实践细节,对电源设计人员具有重要参考价值。(149字)

Jack010169的博客 178

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

基于OkHttp3,Retrofit2和RxJava2高度封装的网络请求库

RxJava2_Retrofit2_GoodHttpUtils 项目地址 该网络库基于OkHttp3,Retrofit2和RxJava2进行了高度封装,使网络请求变得异常方便,支持单文件,多文件上传及进度监听,支持文件下载及进度监听 目前对以下需求进行了封装 一般的请求(类似表单) 传复杂的Json对象 单个文件上传监听进度 单个文件上传监听进度+其他表单参数 多文件上传监听进度+其他表单参数 ...

虎皮青椒没虎皮 1415

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android ion网络请求,Android网络请求Retrofit2+Rxjava2+Okhttp3的简单封装

前言:Retrofit2+Rxjava2+Okhttp3的网络请求框架无疑是当前最流行的网络请求方式,retrofit负责请求的数据结果,rxjava负责线程间的调度,okhttp负责数据请求的过程,Retrofit2+Rxjava2+Okhttp3三者完美的切合使得其功能更加强大,简单记录下在项目中使用时的简单封装。1.导入依赖implementation 'io.reactivex.rxjav...

weixin_28836507的博客 462

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于okhttp3+rxjava2+retrofit2的MVVM模式网络请求

前言 MVC、MVP、MVVM是我们工作和面试中都比较重要的一块,但很多时候我们却有点迷惑。有时候看了好多博文都搞不懂他们是啥,有时候想写个MVP模式,写着写着就成了MVC模式。这个请求框架,也是基于我自己的理解和众多网友的博文进行封装的。另外由于本人水平有限,如果写的不对或者不严谨的地方,请不要打我。也希望能多多交流。 概述 说到Android MVVM,相信大家都会想到Databindi...

freak_csh的博客 3888

Android网络请求Retrofit2+Rxjava2+Okhttp3的简单封装

前言:Retrofit2+Rxjava2+Okhttp3的网络请求框架无疑是当前最流行的网络请求方式,retrofit负责请求的数据结果,rxjava负责线程间的调度,okhttp负责数据请求的过程,Retrofit2+Rxjava2+Okhttp3三者完美的切合使得其功能更加强大,简单记录下在项目中使用时的简单封装。1.导入依赖implementation 'io.reactivex.rxjav...

ruancw的博客 2566

Rxjava2+Retrofit2+Okhttp3实现网络请求实例

最近不是很忙,用Rxjava2+Retrofit2+Okhttp3写了个网络请求的demo,有错误的地方请大家指正,谢谢。1.引入第三方库//rxjava implementation 'io.reactivex.rxjava2:rxjava:2.1.14-RC1' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'//retrofit im...

zhangyiminsunshine的博客 1511

超简单MVP+网络请求框架(Retrofit2+Rxjava2+OkHttp3)

创建一个存放请求网络接口的类 public class MyContacts { //接口头 public static final String BASE_URL=&amp;amp;amp;amp;quot;http://172.17.8.100/small/user/v1/&amp;amp;amp;amp;quot;; //登录 public static final String USER_LOGIN=&amp;amp;amp;am

ZHUHUOHUO的博客 656

java封装有哪三步_三步Retrofit2+RxJava2+OkHttp3网络请求封装

今天来分享一下Retrofit2+RxJava2+OkHttp3的封装。第一步 - 那自然是引用相关的库:compile 'com.squareup.retrofit2:retrofit:2.3.0'compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'// gson解析,可以自行替换compile 'com.squareup.retrofit...

weixin_35127842的博客 273

Android Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 四 文件下载(图片下载为例)

文件下载

森森先生的博客 2148

XHttp2 一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp进行组装

XHttp2 一个功能强悍的网络请求库,使用RxJava2 + Retrofit2 + OKHttp组合进行封装。 关于我 特征 支持默认、全局、局部三个层次的配置功能。 支持动态配置和自定义底层框架Okhttpclient、Retrofit. 加入基础ApiService,减少Api冗余。 支持多种方式访问网络GET、POST、PUT、DELETE等请求协议。...

xuexiangjys的博客 7903

网络请求篇--Retrofit2.0+RxJava+OkHttp

本篇我将结合实际写一些RxJava配合Retrofit2.0+OkHttp3的网络请求库的操作;转载http://www.jianshu.com/p/4c0b9793d0b7 OkHttp3和Retrofit2.0这些都是Square的东西,所以相互支持。Retrofit2.0的底层网络请求就是OkHttp实现的; Retrofit2.0+RxJava+OkHttp Retrofit2.

yoyo_0316的博客 732
上一篇: ConstraintLayout介绍与具体使用
下一篇: 二分法查找
HUandroid
博客等级 码龄10年 35粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值