栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

安卓网络编程之Retrofit框架

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

安卓网络编程之Retrofit框架

安卓网络编程之Retrofit框架

文章目录
    • 安卓网络编程之Retrofit框架
  • 前言
  • 一、Retrofit框架
  • 二、使用步骤
    • 1.引入库
    • 2.简单使用直接贴个代码吧
      • 2.1先定义一个接口
      • 2.2简单使用贴一下使用的代码
    • 3.进阶使用一:直接将数据转对象,无需用第三方库gson等
    • 4.进阶使用二:使用带参数发起请求@Query
    • 5.进阶使用三:@QuaryMap
  • 总结


前言

在前面的文章里我记录了java的网络请求方式,后来记录了OKHttp框架,然后由于OkHttp框架大声还是诀的麻烦了,于是,又有了这个Retrofit框架,这个Retrofit是在OkHttp上进一步封装了,还引入了注解处理方式,最近正好在学习,那就记录一下吧,


一、Retrofit框架

可以去github上看哈,这里我贴一下地址
https://square.github.io/retrofit/

二、使用步骤 1.引入库

代码如下(示例):
这里的4个建议直接一次引入,具体为什么后面就知道了

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    //gson转换器
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    //rxjava转换器
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
    //string转换器
    implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
2.简单使用直接贴个代码吧 2.1先定义一个接口

代码如下(示例):

package com.example.retrofit;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;

public interface MyRetrofit {

    @GET("/") //注意这个是接口,不是
    Call getJson();//这里的方法名随便写啦,但是前面的数据类型表示返回的原始数据类型
}

注意看我导入的包,不要弄错啦

2.2简单使用贴一下使用的代码
public class MainActivity extends AppCompatActivity {

    private String TAG;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //随便搞个tv
        textView = findViewById(R.id.TE);
        //这里感觉和okHttp类似有没有
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.wanandroid.com/banner/json/")//没有接口用的同学可以去搜玩安卓
                .build();
                //这里有区别是通过create方法将接口实例化
        MyRetrofit myRetrofit = retrofit.create(MyRetrofit.class);
        //实例化了不就可以调用上面那个方法了对不对,然后我们就得到返回的原始数据了
        Call json = myRetrofit.getJson();
        //然后将其入队重写方法就有下面的了,没啥好说的,和OKhttp差不多
        json.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                //请求成功了处理数据
                if (response.isSuccessful()) //获取一下请求码,判断一下
                {
                    String s = response.body().String;//===============注意这里是String不是toString,否则结果不对的
                                        Gson gson = new Gson();
                    //使用第三方库让字符串转对象,但是有更简单的方法啦
                    myBean myBean = gson.fromJson(s, myBean.class)
                    
                    Log.e(TAG, "onResponse: ->"+s );
                    textView.setText(s);//注意这两个都是在主线程,可以直接操作UI
                }

            }

            @Override
            public void onFailure(Call call, Throwable t) {
                    //这是失败的时候
                Log.e(TAG, "onFailure: 失败了");
            }
        });
    }
}

特别说明一下:
retrofit把网络请求的Url分成两部分设置:第一部分在创建Retrofit实例时通过.baseUrl()设置,第二部分在网络接口注解中设置,比如上面接口的"“/discovery/categories”,网络请求的完整地址Url = Retrofit实例.baseUrl()+网络请求接口注解(),注意这个/吧,好像有的时候会出问题的,就是两部分交替的那里

3.进阶使用一:直接将数据转对象,无需用第三方库gson等

上面的4个依赖就共同写作起作用了,直接上代码
修改接口

public interface MyRetrofit {
    @GET("/")
    Call getJson();//============注意这里修改了返回的数据类型为jsResult
}

好了接着去修改活动的代码

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.TE);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://www.wanandroid.com/banner/json/")
                .addConverterFactory(GsonConverterFactory.create())//===================注意这一行必须要添加
                .build();
        MyRetrofit myRetrofit = retrofit.create(MyRetrofit.class);
        Call json = myRetrofit.getJson();
        json.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                //请求成功了处理数据
                if (response.isSuccessful()) {//获取一下请求码,判断一下
                    
                    JsResult body = response.body();//===================这一句就可以了简单不,他就直接变成和我们bean类中对应的对象了
                }
            }
            @Override
            public void onFailure(Call call, Throwable t) {
                //这是失败的时候
                Log.e(TAG, "onFailure: 失败了");
            }
        });
    }
4.进阶使用二:使用带参数发起请求@Query

这个是要根据接口来配合使用的,我看玩安卓的数据太多了,这个借用一下领劵联盟的接口,不知道的b站搜索一下就好了
对应的baseUrl改成这个https://api.sunofbeaches.com/shop
好了,上代码,在代码中注释说明吧
先新建bean类,这个不贴代码了,修改我们的接口吧

public interface MyRetrofit {
    @GET("/")
    Call getJson();

    @GET("/search")//注意这里不要写错,要与文档保持一致
    Call getParam(@Query("keyword")String keyword,@Query("page")int page);//这里是主要部分
}

接着修改活动中代码,都差不多

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.TE);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.sunofbeaches.com/shop/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        MyRetrofit myRetrofit = retrofit.create(MyRetrofit.class);
        Call task = myRetrofit.getParam("搜索关键字", 0);
        task.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                //请求成功了处理数据
                if (response.isSuccessful()) {//获取一下请求码,判断一下
                    //这一句就可以了简单不
                    getWithParam body = response.body();
                    String s = body.toString();
                    textView.setText(s);
                }
            }
            @Override
            public void onFailure(Call call, Throwable t) {
                //这是失败的时候
                Log.e(TAG, "onFailure: 失败了");
            }
        });
    }
}

有个不好的消息就是他这个服务器好像也不工作了哈哈哈,尴尬,还是去玩安卓上找一个吧

5.进阶使用三:@QuaryMap

同样还是修改接口

public interface MyRetrofit {
    @GET("/")
    Call getJson();

    @GET("/search")//注意这里不要写错,要与文档保持一致
    Call getParam(@Query("keyword")String keyword,@Query("page")int page);
    
  Call getParamsWithMap(@QueryMap Map params);;//注意返回的类型不是新的,是上面的,因为是上面的集合嘛

接着修改

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.TE);
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.sunofbeaches.com/shop/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        MyRetrofit myRetrofit = retrofit.create(MyRetrofit.class);
        //===========修改处
        Map param = new HashMap<>();
        param.put("keyword","搜索关键字");
        param.put("page",0);
        //再把这个集合作为参数传进去
        Call paramsWithMap = myRetrofit.getParamsWithMap(param);
        paramsWithMap.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                //请求成功了处理数据
                if (response.isSuccessful()) {//获取一下请求码,判断一下
                    //这一句就可以了简单不
                    getWithParam body = response.body();
                    String s = body.toString();
                    textView.setText(s);
                }
            }
            @Override
            public void onFailure(Call call, Throwable t) {
                //这是失败的时候
                Log.e(TAG, "onFailure: 失败了");
            }
        });
    }
}

这都差不多啦

写着写着发现了一篇总结的好的文章https://www.jianshu.com/p/bca05b853c8c,
ok,不写了哈哈哈哈哈

总结

更多内容-> https://www.jianshu.com/p/bca05b853c8c,

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/839416.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号