Retrofit源码学习一:Retrofit介绍

目录

1、系列文章:

2、相关视频:

3、简介和流程:

参数作用:

4、使用:

4.1、添加依赖:

4.2、代码体现:

4.3.1、HttpbinService.java

4.3.2、RetroTest2Activity.java

4.2.3、布局文件

4.2.4、打印

4.3、总结:


1、系列文章:

Retrofit源码学习一:Retrofit介绍

Retrofit源码学习二:代理模式

Retrofit源码学习三:Retrofit源码详解一

Retrofit源码学习四:Retrofit源码详解二

Retrofit源码学习五:Retrofit中同步、异步请求解析

Retrofit源码学习六:框架中的设计模式

2、相关视频:

Retrofit网络库https://www.imooc.com/learn/10002https://www.imooc.com/learn/1000第一个视频过于简单

破解Retrofithttps://www.imooc.com/learn/1128https://www.imooc.com/learn/1128

第二个又过于繁琐

 Android零基础入门到精通Retrofit的基本使用https://www.bilibili.com/video/BV1C64y1U7ty?from=search&seid=13822437775418127065&spm_id_from=333.337.0.0icon-default.png?t=L892https://www.bilibili.com/video/BV1C64y1U7ty?from=search&seid=13822437775418127065&spm_id_from=333.337.0.0

这个刚好入门使用

3、简介和流程:

Retrofit 是基于OKhttp网络请求框架的二次封装,本质是OKhttp。所以说Retrofit并不是一个网络框架、它只是一个网络框架封装。

总结:

1、APP应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数,之后由Okhttp完成后续的请求操作

2、在服务端返回数据之后,Okhttp将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析

参数作用:

4、使用:

4.1、添加依赖:

    //rxjava
    implementation 'io.reactivex:rxjava:1.1.3'

    //rxandroid
    implementation 'io.reactivex:rxandroid:1.1.0'

    //retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.0.2'
    implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
    implementation 'com.squareup.retrofit2:converter-scalars:2.0.2'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

4.2、代码体现:

4.3.1、HttpbinService.java

package com.test.retro1.test2;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

/**
 * @author songzi522
 * on 2021/9/21
 * Description:
 */
public interface HttpbinService {

    // https://www.httpbin.org/post   xxx=value
    @POST("post")
    @FormUrlEncoded
    Call<ResponseBody> post(@Field("username") String userName, @Field("password") String pwd);

    @GET("get")
    Call<ResponseBody> get(@Query("username") String userName, @Query("password") String pwd);


}

4.3.2、RetroTest2Activity.java

package com.test.retro1.test2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.test.retro1.R;

import java.io.IOException;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class RetroTest2Activity extends AppCompatActivity {

    private static final String TAG = "RetroTest2Activity";

    private Retrofit retrofit;
    private HttpbinService service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retro_test2);

        retrofit = new Retrofit.Builder()
                .baseUrl("https://www.httpbin.org/")//设置网络请求的URL地址
                .build();

        service = retrofit.create(HttpbinService.class);

        findViewById(R.id.btn_get).setOnClickListener(view -> getQingQiu());

        findViewById(R.id.btn_post).setOnClickListener(view -> post());

    }

    private void getQingQiu() {
        retrofit2.Call<ResponseBody> call = service.get("lance", "123");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            }
        });
    }

    private void post() {
        retrofit2.Call<ResponseBody> call = service.post("lance", "123");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            }
        });
    }

}

4.2.3、布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".test2.RetroTest2Activity">

    <TextView
        android:id="@+id/tv_mark"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="RetroTest2Activity"
        android:textSize="30sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_get"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_mark"
        android:text="get请求"
        android:textSize="26sp"
        android:textAllCaps="false"
        />


    <Button
        android:id="@+id/btn_post"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn_get"
        android:text="post请求"
        android:textSize="26sp"
        android:textAllCaps="false"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

4.2.4、打印

get请求打印

RetroTest2Activity: onResponse: {
      "args": {
        "password": "123", 
        "username": "lance"
      }, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Host": "www.httpbin.org", 
        "User-Agent": "okhttp/3.2.0", 
        "X-Amzn-Trace-Id": "Root=1-6149b2a0-5e21c7f72ef94f3e27651520"
      }, 
      "origin": "113.118.106.233", 
      "url": "https://www.httpbin.org/get?username=lance&password=123"
    }

post请求打印:

RetroTest2Activity: onResponse: {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "password": "123", 
        "username": "lance"
      }, 
      "headers": {
        "Accept-Encoding": "gzip", 
        "Content-Length": "27", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "www.httpbin.org", 
        "User-Agent": "okhttp/3.2.0", 
        "X-Amzn-Trace-Id": "Root=1-6149b36a-2646a65b7e3551205f394e0c"
      }, 
      "json": null, 
      "origin": "113.118.106.233", 
      "url": "https://www.httpbin.org/post"
    }

4.3、总结:

  • 1、添加Retrofit库的依赖,添加网络权限
  • 2、创建 接收服务器返回数据 的类
  • 3、创建 用于描述网络请求 的接口
  • 4、创建 Retrofit实例
  • 5、创建 网络请求接口实例
  • 6、发送网络请求(异步、同步)
  • 7、处理服务器返回的数据

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android是一个开源的操作系统,因此有大量优秀的开源项目和源码可供使用和学习。以下是一些我们认为是好的Android开源源码的例子: 1. RetrofitRetrofit是一个用于构建网络请求的REST客户端库,它简化了与服务器进行通信的过程,提供了强大的功能和易于使用的API。其源码清晰易懂且很好维护。 2. EventBus:EventBus是一个用于替代Android中广播和Intent传递数据的异步事件总线库。它简化了组件之间的通信,并且非常灵活和高效。EventBus的源码设计精巧,实现了高性能的事件传递机制。 3. ButterKnife:ButterKnife是一个Android视图绑定库,通过注解的方式在Activity和Fragment中自动绑定视图。它简化了findViewById等繁琐的视图绑定过程,提高了开发效率。ButterKnife的源码注释详细,清晰易懂。 4. Android-Universal-Image-Loader:Android-Universal-Image-Loader是一个强大的异步图片加载和缓存库,支持网络、本地和资源文件中的图片加载,并提供了丰富的配置选项。其源码结构清晰,具有高度可扩展性。 5. Glide:Glide是一个流畅地加载图片和动画的图片加载库,具有高效的缓存策略和内存使用管理,支持GIF、WebP、PNG等格式的图片加载和显示。其源码简洁易懂,并且具有良好的性能。 这些开源项目提供了很好的学习资源,可以帮助开发者更好地理解Android开发中一些常用功能的实现原理,并且可以结合自己的项目进行定制和扩展。使用和研究这些优秀的源码,有助于提高Android开发的效率和质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值