Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(二)网络层的封装

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

接着来,本系列的第二篇,就是重中之重啦,网络层的封装。第一篇是:Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构

本文章结构:1.网络层封装涉及的东西;2.如何封装网络层;3.如何使用封装了的网络层。


一、网络层封装涉及的东西

大众方案:OkHttp+Rxjava+Rtrofit
介绍: Retrofit和okHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库,Retrofit简化了网络请求流程,基于OkHtttp做了封装,解耦的更彻底:比方说通过注解来配置请求参数,通过工厂来生成CallAdapter,Converter,你可以使用不同的请求适配器(CallAdapter), 比方说RxJava,Java8, Guava。你可以使用不同的反序列化工具(Converter),比方说json, protobuff, xml, moshi等等。
官网 http://square.github.io/retrofit/
github https://github.com/square/retrofit
Rxjava:http://gank.io/post/560e15be2dca930e00da1083

二、如何封装网络层

1.导入
// https://github.com/ReactiveX/RxAndroid rx异步
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex:rxjava:1.1.6'
    // https://github.com/square/retrofit  网络请求
    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'
    //https://github.com/franmontiel/PersistentCookieJar Okhttp的Cookie缓存
    compile 'com.github.franmontiel:PersistentCookieJar:v1.0.0'





2.RetrofitUtil实现Retrofit单例:
public class RetrofitUtil {
    private static final String TAG = "retrofit";
    //TODO:修改主机地址
    private static final String BASE_URL = "https://api.douban.com";
    private static final int DEFAULT_TIMEOUT = 5;
    private static Retrofit retrofit;

    //实例化私有
    private RetrofitUtil(){

    }
//单例Retrofit 
    public static Retrofit getInstance(){
        if(retrofit==null) {
        //这里有个很关键的地方,就是传入App的上下文啦。
            ClearableCookieJar cookieJar =
                    new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(App.getInstance()));
            OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();                //okhttp创建,写入缓存机制,还有addInterceptor
            httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
            File cacheFile = new File(App.getInstance().getCacheDir(), "superman");
            Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100Mb。这里开始就是缓存设置啦。实现一键缓存以及请求头的配置等等
            httpClientBuilder.cache(cache);
            httpClientBuilder.cookieJar(cookieJar);
            httpClientBuilder.addInterceptor(LoggingInterceptor);
            httpClientBuilder.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR);
            httpClientBuilder.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR);

            return new Retrofit.Builder()                          //retrofit的创建。
                    .client(httpClientBuilder.build())          //传入okhttp
                    .addConverterFactory(GsonConverterFactory.create())             //传入gson解析手段
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())           //传入异步手段
                    .baseUrl(BASE_URL)              //传入服务器地址
                    .build();
        }else{
            return retrofit;
        }
    }
    //okHttp的拦截器
    private static final Interceptor LoggingInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            long t1 = System.nanoTime();
            Logger.t(TAG).i(String.format("Sending request %s on %s%n%s", request.url(),  chain.connection(), request.headers()));
            Response response = chain.proceed(request);
            long t2 = System.nanoTime();
            Logger.t(TAG).i(String.format("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers()));
            return response;
        }
    };
    //okHttp的拦截器
    private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            if(!NetUtil.isConnected(App.getInstance())){//判断是否有网络再进行操作
                request = request.newBuilder()
                        .cacheControl(CacheControl.FORCE_CACHE)
                        .build();
                Logger.t(TAG).w("no network");
            }
            //请求头缓存控制
            Response originalResponse = chain.proceed(request);
            if(NetUtil.isConnected(App.getInstance())){
                //有网的时候读接口上的@Headers里的配置,你可以在这里进行统一的设置
                String cacheControl = request.cacheControl().toString();
                return originalResponse.newBuilder()
                        .header("Cache-Control", cacheControl)
                        .removeHeader("Pragma")
                        .build();
            }else{
                return originalResponse.newBuilder()
                        .header("Cache-Control", "public, only-if-cached, max-stale=2419200")
                        .removeHeader("Pragma")
                        .build();
            }
        }
    };
}






3.调用前关键配置:

一个app的类获取app的上下文,以及其关键配置
public class App extends Application {

    private static App app;
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }
    @Override
    public void onCreate() {
        super.onCreate();
        MultiDex.install(this);
        app = this;
    }
    public static App getInstance() {
        return app;
    }
}





//这里关键是要注册这个app的上下文
    <application
        android:name=".App"  //也就是这里啦
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:allowBackup="true"
        android:theme="@style/AppTheme">
        <activity android:name=".activity.MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>





三、如何使用封装的网络层:

1.输入主机地址,编写接口:

public interface MovieRequest {
//    //请求参数,注意这个接口要跟bean完全对应,根据第二点来操作就对了
    @GET("/v2/movie/top250")
    Observable<AbilityBean> getMovies(@Query("start") int start, @Query("count") int count);
}






2.使用postman等工具先查看那个数据,json。然后使用gsonformat,生成那个bean。GsonFormat的使用

package com.fuzhucheng.rxjavartrofitrecyclerview.bean;

import java.util.List;

/**
 * Created by 符柱成 on 2016/12/14.
 */
public class AbilityBean {

    public int image;
    public String place;
    public int like;
    public int price;


    public int count;
    public int start;
    public int total;
    public String title;
    public List<SubjectsEntity> subjects;

    public AbilityBean(int image, String place, int like, int price) {
        this.image = image;
        this.place = place;
        this.like = like;
        this.price = price;
    }


    public static class SubjectsEntity {

        public RatingEntity rating;
        public String title;
        public int collect_count;
        public String original_title;
        public String subtype;
        public String year;
        public RatingEntity.ImagesEntity images;
        public String alt;
        public String id;
        public List<String> genres;
        public List<RatingEntity.CastsEntity> casts;
        public List<RatingEntity.DirectorsEntity> directors;


        public static class RatingEntity {


            public int max;
            public double average;
            public String stars;
            public int min;


            public static class ImagesEntity {

                public String small;
                public String large;
                public String medium;


            }

            public static class CastsEntity {


                public String alt;
                public AvatarsEntity avatars;
                public String name;
                public String id;


                public static class AvatarsEntity {


                    public String small;
                    public String large;
                    public String medium;


                }
            }

            public static class DirectorsEntity {


                public String alt;
                public AvatarsEntityX avatars;
                public String name;
                public String id;


                public static class AvatarsEntityX {


                    public String small;
                    public String large;
                    public String medium;


                }
            }
        }
    }
}








3.但是呢我们经常看到一个这么大的json,有些数据我们是不会用到的嘛,所以我们可以写多一个bean去对应我们的客户端嘛。

如果我们的客户端一个列表只需这么多信息,那就写个这么小的bean就足够了嘛。
public class AbilityItem {
    private String image;
    private String title;
    private String content;

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public AbilityItem(String image, String title, String content) {
        this.image = image;
        this.title = title;
        this.content = content;
    }
}








4.使用

    private List<AbilityItem> datas = new ArrayList<>();//为列表保存bean
    private CommonAdapter<AbilityItem> adapter;//列表的适配器
    private MovieRequest movieRequest;//请求的接口




//这个方法放进loadData加载即可
 private void getMovie() {
        movieRequest = RetrofitUtil.getInstance().create(MovieRequest.class);//使用我们的工具类,反射得到请求体
        //下面是rxjava的格式啦
        movieRequest.getMovies(0, 10)
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<AbilityBean>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        ToastUtils.showToast(getActivity(), getString(R.string.request_error));
                    }

                    @Override
                    public void onNext(AbilityBean abilityBean) {
                        swipeRefreshLayout.setRefreshing(false);//这个是下拉刷新的
                        datas.clear();//避免数据重复,清楚数据
                        ToastUtils.showToast(getActivity(), getString(R.string.request_success));
                        for (int i = 0; i < abilityBean.subjects.size(); i++) {
                            datas.add(new AbilityItem(abilityBean.subjects.get(i).images.medium, abilityBean.subjects.get(i).title, abilityBean.subjects.get(i).year));//列表的数据
                            bitmapList.add(abilityBean.subjects.get(i).images.large);//那个轮播图的数据
                        }
                        loadConvenientBanner();//从父类继承得来的方法
                        //下面是设置适配器,对应view与数据
                        adapter = new CommonAdapter<AbilityItem>(getActivity(), R.layout.item_fragment_ability_recyclerview, datas) {
                            @Override
                            protected void convert(ViewHolder holder, final AbilityItem abilityItem, final int position) {
                                //使用这个封装好的adapter模式去设置好一系列的view,与数据对应上
                                holder.setText(R.id.place, abilityItem.getTitle());
                                holder.setText(R.id.price, abilityItem.getContent());
                                ImageView circleImageView = holder.getView(R.id.image);
                                Glide.with(getActivity()).load(abilityItem.getImage()).into(circleImageView);
                            }
                        };
                        recyclerView.setAdapter(adapter);
                    }
                });
    }



其中的一个调试原理:Rtrofit做好的封装是:1.请求不成功执行onError;2.请求成功,但是onNext解析过程出现错误,同样执行onError。


源码下载:Android-多列表的项目Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装

好了,Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(二)网络层的封装讲完了。本博客是这个系列的第二篇,所以讲得是网络层的封装。另外,这个系列还有一些我在外包项目过程中做的优化,以及一些发布签名等等技巧,我会尽快出完给大家,分享经验给大家。欢迎在下面指出错误,共同学习!!你的点赞是对我最好的支持!!

更多内容,可以访问JackFrost的博客


Android聊天Demo实现(数据库+RecyclerView) 配合博客教程:Android框架之路——聊天Demo实现 立即下载

相关推荐

绿联UGOS Pro系统虚拟机部署Windows 11详细教程(跳账户登录,安装内存驱动)

总的来说,此次的虚拟机部署Windows 11出现的问题应该是目前几乎所有虚拟机都可能出现的问题,和绿联是没有关系的。所以说如果你在其它NAS上虚拟机部署Windows 11系统如果出现同样的问题,那么今天教程的方案也同样适用于你。

qq_63499861的博客 1万+

android rxjava使用,android – 在RecyclerView Adapter中使用RxJava

所以几个星期前我问了这个问题:recyclerview periodic ui child updates.今天我想用Rxjava重构那个功能.它实际上很简单,我完成以下方式:@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if (friend.getGameStatus()....

weixin_31921223的博客 364

基于STM32的超声波流量计设计

本项目基于STM32微控制器设计了一种超声波流量计,采用时间差法测量液体或气体的流速,计算流量并通过显示屏实时显示,同时支持远程数据传输。本设计通过STM32微控制器实现了基于时间差法的超声波流量计,集成了超声波信号采集、流量计算、状态显示和远程通信功能。本系统需要实现超声波信号的实时采集与处理,计算流速和流量,并将数据通过OLED显示和无线模块上传。系统需具备高精度的时间测量能力和良好的抗干扰能力。通过计算超声波在顺流和逆流方向上的传播时间差,结合管道直径与流体特性,计算流速并进一步计算流量。

stm32d1219的博客 2347

Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构

项目介绍:1.这是一个简易使用的网络请求封装项目,可快速移植实现安卓网络层的开发;2.这是一个常见的app模板,使用较好的app架构,并实现一系列的优化。 文章结构:(1)整个应用的架构模式;(2)Activity和Fragment的封装;

Jack__Frost的博客 1万+

ui(new Ui::MainWindow)的解析

Ui命名空间的变量名,和默认空间的变量名虽然一样,但实际是两个不同的东西。所以构造函数中调用MainWindow是没问题的,因为它不是在调用自身,而是在调用其他命名空间下的另一个同名的MainWindow类。这里使用C++的成员初始化列表语法,初始化成员变量指针ui,可这里有个问题,在MainWindow的构造函数中new 一个MainWindow,这又调用一下MainWindow的构造函数,这岂不是会死循环?ui_mainwindow.h文件。mainwindow.h文件.

sinat_31608641的博客 1193

给宇树Go2机器人装‘眼睛’:在Jetson Orin Nano上从零部署YOLOv5的保姆级避坑实录

本文详细介绍了在Jetson Orin Nano上为宇树Go2机器人部署YOLOv5视觉系统的完整流程,涵盖硬件选型、环境配置、模型优化及系统集成等关键步骤。针对机器人应用场景特有的离线部署、版本冲突和实时推理等挑战,提供了实用的解决方案和性能优化技巧,帮助开发者快速实现机器人的视觉能力升级。

weixin_29169505的博客 378

Android Retrofit + RxJava + OkHttp 网络请求高效封装方案

Retrofit + RxJava + OkHttp 是 Android 开发中常用的网络请求库组合。Retrofit 是一个类型安全的 HTTP 客户端,RxJava 是一个响应式编程库,OkHttp 是一个高效的 HTTP 客户端。允许在运行时动态修改 Retrofit 和 OkHttp 的配置,例如 Base URL、超时时间、拦截器等。将网络请求与 Activity/Fragment 的生命周期绑定,避免内存泄漏。通过 OkHttp 的缓存拦截器实现本地缓存,减少网络请求。Token 自动管理。

tangweiguo03051987的博客 1064

如何使用AKShare作为OpenBB的数据源

`openbb_akshare`项目是 OpenBB 的数据源扩展。可以用于查询A股和港股数据

FinAnalyzer金融分析工具 3195

Android 网络请求封装(Retrofit+OkHttp+RxJava+AutoDispose),解决网络请求引起的内存泄漏

Retrofit本质上是网络请求的封装库,并没有参与真正的网络请求操作,他为我们提供丰富的注解,用更优雅的方式包装网络请求需要的各个元素; OkHttp完成真正的网络请求操作,接收Retrofit获取的请求地址、请求头、参数等信息发起网络请求,获取网络数据; RxJava处理异步操作,他提供了丰富强大的操作符,使用RxJava来完成网络请求过程中繁琐的线程调度; AutoDispose,使用AutoDispose让网络请求订阅事件与Activity/Fragment生命周期关联,在页面销毁时,取消网络

u013624014的博客 3258

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1902

AutoSAR系列讲解(深入篇)13.6-闪烁一颗LED灯 6

闪烁一颗LED灯:配置SWC和生成代码

雪云飞星的博客 1万+

自学Android开发 我的Retrofit2+RxJava3的封装

一、依赖配置 在Model:Android_xxxx.app build.gradle 文件夹里添加 dependencies { //retrofit2 implementation 'com.squareup.retrofit2:retrofit:2.9.0' //Gson implementation 'com.squareup.retrofit2:converter-gson:2.9.0' //Jackson //implementation

一个从事Android开发的平凡工程师 1647

aic8800出现insmod: can‘t insert ‘/lib/modules/4.9.191/aic8800_fdrv.ko‘: No such device

2、如果单独编译wifi驱动,则把CONFIG_PLATFORM_UBUNTU?= y都改为CONFIG_PLATFORM_ALLWINNER?1、如果把wifi驱动嵌入到内核编译,则在makefile中加入这一句。后面再修改对应平台的交叉编译链和内核吗路径等。

mantouyouyou的博客 509

Retrofit+Rxjava网络层的优雅封装

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。面试过程一定要有礼貌!

2401_83704218的博客 674

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android组件化开发(二)--网络请求组件封装

前面一篇文章我们讲解了maven私服的搭建,maven私服在组件化框架中有一个很重要的地位就是可以将我们的lib库放到局域网中,供公司其他开发者使用,实现类库的分享。下面是这个系列准备实现的一个组件化实战项目框架笔者打算从下往上依次来实现我们项目中的组件,毕竟地基稳固了,房子才可以搭的很结实。注意:这里不会对封装代码进行长篇大论,主要还是以思路点拨的方式进行,如果需要看完整代码的可以移步到github。

yuhaibing111的博客 2109

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android模块化-----网络模块封装

在实际的应用开发中,常用到的网络框架有OkHttp、Retrofit、RxJava+RxAndroid,每个框架都有自己的优点:例如OkHttp,因为其特有的拦截器责任链模式,可以拦截请求和响应;Retrofit内部封装OkHttp,它更高效在于使用注解封装Http请求,在之前Retrofit中也使用过;RxJava的优势在于它的操作符,事件的转换。 每个框架都有自己的优点,因此通过整合全部的请求...

qq_33235287的博客 1581

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android之全面解析Retrofit网络框架封装库

转载请标明出处:【顾林海的博客】 前言 Retrofit是Square公司推出的一个HTTP的框架,主要用于Android和Java,Retrofit会将每一个HTTP的API请求变成一个Java的接口,使用起来非常方便,同时Retrofit又是一个Restful HTTP的网络请求框架的封装。 介绍与使用 在上图中,我们会在应用层发起网络请求,同时请求会经过Retrofit这层,Retr...

顾林海 2万+

Android Retrofit+Rxjava实现网络请求(Retrofit如何结合Rxjava)

Rxjava+Retrofit实现网络请求前言操作添加依赖添加依赖 前言 Retrofit和Rxjava单独使用的文章可以看本人写的这两篇,本文是在Retrofit网络请求框架这篇文章的项目上改动的。 Android Retrofit网络请求框架 Android RxJava3入门 操作 添加依赖 //retrofit与Rxjava3结合 implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' 添加依赖 ...

舒小羽的博客 1228

Android RecyclerView 之 列表宫格布局的切换

RecyclerView 的使用我就不再多说,接下来的几篇文章主要说一下 RecyclerView 的实用小功能,包括 列表宫格的切换,吸顶效果,多布局效果等

X_sunmmer的博客 1725

Android Retrofit

协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟HttpClient,HttpUrlConnection。只是帮使用者来进行工 作简化的,比如配置网络,处理数据等工作,提高这一系列操作的复用性。主要负责应用层面的封装,就是说主要面向开发者,方便使用,比如请求参数,响应数据的处 理,错误处理等等。所以,网络请求的本质仍旧是OkHttp。用户网络请求的接口配置繁琐,尤其是需要配置请求。封装了具体的请求,线程切换以及数据转换。部分的优化,比如多路复用,,请求头,参数的时候;......

xubo667的博客 2737

在android中实现RecyclerView并显示动态数据?

首先RecyclerView是为了填补ListView. 当涉及到一长串列表时,创建视图是昂贵的,它确实变得昂贵。假设一个带有食物列表的食品订购应用程序,可能有 100 或数千种食物,在您的移动屏幕上您只看到 10 种(假设大小限制)。Adapter 是 View 和 Data 之间的桥梁,它基本上接受布局和数据,然后将两者绑定并显示在 RecyclerView 上。布局是一样的,只是改变了数据!开发人员不用担心,当您向下滚动时,上部视图会被回收以用作新的底部视图,并且数据已更改,仅此而已。

yihanss的博客 2497

Android--Retrofit+RxJava网络请求框架封装

一、 Retrofit网络请求框架 //添加依赖 compile 'com.squareup.okhttp3:okhttp:3.1.2'// Okhttp库 compile 'com.squareup.retrofit2:retrofit:2.0.2'// Retrofit库 compile 'com.squareup.retrofit2:converter-gson:2.0.2'//GSON解析器 //添加网络权限 <uses-permission android:name="android.pe

Sim的博客 1144

如何快速掌握mpc解析器组合子:C语言构建复杂解析器的10个核心技巧

mpc是一个强大的C语言解析器组合子库,它允许开发者通过组合简单的解析器来构建复杂的语法解析器。本文将分享10个核心技巧,帮助你快速上手并掌握mpc的使用方法,轻松应对各种解析任务。 ## 1. 了解mpc的核心数据结构 在使用mpc之前,首先需要了解其核心数据结构。mpc中最关键的是`mpc_parser_t`结构体,所有的解析器都是基于这个结构体创建的。 ```c struct mpc_

gitblog_00523的博客 704

Kotlin实现Retrofit网络请求RecyclerView展示图片列表

1.新建一个项目   选中lnclude kotlin support2.然后导包 compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:converter-sca...

你全家都是博客 1227
上一篇: 程序员必懂的53个英文单词
下一篇: 深入Java基础(一)——基本数据类型及其包装类
Footloose_
博客等级 码龄10年 254粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值