网络通信框架之retrofit
主页: [https://github.com/square/retrofit](https://github.com/square/retrofit)
注意: 使用Retrofit的前提是**服务器端代码遵循REST规范
!!!!!**
功能:
* 效率非常高
* 可以直接将结果转换称Java类
* 主要是配合RxJava一起使用
配置:
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
// OkHttp3
api "com.squareup.okhttp3:okhttp:3.10.0"
api "com.squareup.okhttp3:logging-interceptor:3.10.0"
//网络日志
implementation('com.github.ihsanbal:LoggingInterceptor:3.0.0') {
exclude group: 'org.json', module: 'json'
}
HttpManager.java
package com.loaderman.demo.http; import android.os.Build; import com.ihsanbal.logging.Level;
import com.ihsanbal.logging.LoggingInterceptor;
import com.loaderman.demo.BuildConfig;
import com.loaderman.demo.MyApplication; import java.io.File;
import java.io.IOException; import okhttp3.Cache;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.internal.platform.Platform;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory; public class HttpManager { private static HttpManager apiManager;
private static final String TAG = "HttpManager";
private static final Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
int maxAge = 60 * 5; // 在线缓存在5分钟内可读取
Request request = chain
.request()
.newBuilder()
.addHeader("User-Agent", Build.BRAND + "/" + Build.MODEL + "/" + Build.VERSION.RELEASE)//添加请求头
.header("Cache-Control", "public, max-age=" + maxAge)
.build(); return chain.proceed(request);
}
};
private static final LoggingInterceptor httpLoggingInterceptor = new LoggingInterceptor.Builder()
.loggable(BuildConfig.DEBUG)
.setLevel(Level.BASIC)
.log(Platform.INFO)
.request("Request")
.response("Response")
.build(); private static File httpCacheDirectory = new File(MyApplication.applicationContext.getCacheDir(), "mCache");
private static int cacheSize = 10 * 1024 * 1024; // 10 MiB
private static Cache cache = new Cache(httpCacheDirectory, cacheSize);
private static OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.addInterceptor(httpLoggingInterceptor)
.cache(cache)
.build(); public static HttpManager getInstence() { if (apiManager == null) {
synchronized (HttpManager.class) {
if (apiManager == null) {
apiManager = new HttpManager();
}
}
}
return apiManager;
} private static Apiservice apiservice; public Apiservice getHttpService() {
if (apiservice == null) {
synchronized (new Object()) {
if (apiservice == null) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.104:8080")
.addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
apiservice = retrofit.create(Apiservice.class);
}
}
}
return apiservice;
}
}
package com.loaderman.demo.http; import com.loaderman.demo.bean.User; import java.util.List;
import java.util.Map; import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET; import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap; public interface Apiservice {
// Path是网址中的参数,例如:trades/{userId}
// Query是问号后面的参数,例如:trades/{userId}?token={token}
// QueryMap 相当于多个@Query
// Field用于Post请求,提交单个数据,然后要加@FormUrlEncoded
// Body相当于多个@Field,以对象的方式提交
// @Streaming:用于下载大文件
// @Header,@Headers、加请求头 // 具体查看: https://square.github.io/retrofit/
@GET("/user/user1.json")
Call<User> getUser();
@POST("users/{user}/repos")
Call<List<User>> listRepos(@Path("user") String user);//@Path("user") 将参数替换到UR中 例如传 zhangsan ,那么URl为:users/zhangsan/repos @GET("users/list?sort=desc") //可以对数据进行排序
Call<User> getList(); @POST("users/new")
Call<User> createUser(@Body User user);//可传实体类 @Headers("Cache-Control: max-age=640000")
@GET("user/list")
Call<List<User>> userList(); @Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description); @FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last); @GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options); @GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
}
使用:
package com.loaderman.demo; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; import com.loaderman.demo.bean.User; import com.loaderman.demo.http.HttpManager; import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity { private TextView tvMsg;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvMsg = findViewById(R.id.tv_msg); }
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_get:
HttpManager.getInstence().getHttpService().getUser().enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
boolean successful = response.isSuccessful();
System.out.println("isSuccessful"+ successful);
if (successful){
User user = response.body();
tvMsg.setText(user.toString());
System.out.println("onResponse"+ user);
Toast.makeText(MainActivity.this,user.toString(),Toast.LENGTH_LONG).show();
}else {
Toast.makeText(MainActivity.this,response.code()+response.message(),Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
System.out.println("onFailure"+t.toString());
}
}); break;
}
} }
网络通信框架之retrofit的更多相关文章
- 网络通信框架Retrofit2
网络通信框架Retrofit2 1 概要 Retrofit2的简介以及特点 Retrofit2使用配置(导包,权限等) Retrofit2中常用的注解介绍 Retrofit2实现http网络访问 GE ...
- c#网络通信框架networkcomms内核解析 序言
NetworkComms网络通信框架序言 networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章, ...
- c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池
NetworkComms网络通信框架序言 本例基于networkcomms2.3.1开源版本 gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池 ...
- c#网络通信框架networkcomms内核解析之九 自定义处理方法的运行机制
NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本 gplv3协议 我们自己写的处理方法都称之为自定义处理方法 比如,我们在服务器上写的与登陆相关的处理方法 ...
- c#网络通信框架networkcomms内核解析之八 数据包的核心处理器
NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本 gplv3协议 我们先回顾一个 c#网络通信框架networkcomms内核解析之六 处理接收到的二进制 ...
- NetworkComms网络通信框架V3结构图
NetworkComms网络通信框架序言 来自英国的c#网络通信框架,历时五年打造,由英国剑桥的2位工程师倾情开发,最新版本V3.x版本.
- 强大的网络通信框架(实现缓存)--第三方开源--volley
Android Volley是Android平台上很好用的第三方开源网络通信框架.使用简答,功能强大. Android Volley的库jar包Volley.ja下载连接地址:Volley下载 下载后 ...
- 成熟的C#网络通信框架介绍——ESFramework通信框架
(转自:http://www.cnblogs.com/zhuweisky/archive/2010/08/12/1798211.html) ESFramework通信框架是一套性能卓越.稳定可靠.强大 ...
- DotNetty网络通信框架学习之初识Netty
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
随机推荐
- U盘被识别但不显示盘符怎么样才能解决?
很多朋友在将U盘插入电脑后,会发现右下角的任务栏虽然出现了U盘的图标,但是在我的电脑中并没有显示出U盘的盘符,也就无法继续对U盘进行操作.遇到这种情况该怎么办呢?下面好系统U盘启动就告诉大家相应的解决 ...
- HttpClient 源码阅读
在项目中常用的HttpClient,与我们非常的亲密,为了能处理遇到的Http问题,我们应该去了解里面的机制和实现. 官方文档:http://hc.apache.org/httpcomponents- ...
- datePicker 及 timePicker 监听事件 获取用户选择 年月日分秒信息
public class MainActivity extends AppCompatActivity { private TimePicker timePicker; private DatePic ...
- 【计算机网络】网络地址转换NAT
网络地址转换NAT 要知道到每个IP使能的设备都需要一个IP地址.以一个家庭为例,假设当地的ISP已为该家庭分配过一块地址,但是后期家庭中的智能设备增加(智能手机.电脑等),这些都需要IP地址才可上网 ...
- shell脚本基础和grep文本处理工具企业应用1
bash特性及bash脚本编程初步: 用户要跟计算机交互就需要有终端,比如:显示器.键鼠等,在终端有附着的接口程序 GUI:KDE.GNome.Xfce CLI:/etc/shells bash ...
- C++虚函数作用原理(一)——虚函数如何在C++语言逻辑中存在
C++多态,接触其实也没太长的时间.上课的时候老师总是不停的讲,多态可以实现利用一个基类对象调用不同继承类的成员函数.我就会觉得很伤脑筋,这个的原理到底是什么?是什么呢? 开始的时候我觉得自己应该能够 ...
- matlab 基础知识1
一.数组和矩阵注意 逗号 和 分号 的区别 向量生成方式: 传统方式:行向量 :空格,逗号列向量 :分号,回车 函数方式: x = linspace(a,b,n) 等分关系,从a 到 b, n等分.n ...
- 不使用C库函数(Sprintf)将void* 指针转换为十六进制字符串
#include <stdio.h> #include <stdint.h> #include <stdlib.h> void hexDump(void *ptr, ...
- POJ-3974-Palindrome(马拉车)
链接: http://poj.org/problem?id=3974 题意: Andy the smart computer science student was attending an algo ...
- SQL 日期转换
), ): :57AMSELECT ), ): ), ): ), ): ), ): ), ): ), ): 06), ): ,06), ): ::46), ): :::827AMSELECT ), ) ...