主页: [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的更多相关文章

  1. 网络通信框架Retrofit2

    网络通信框架Retrofit2 1 概要 Retrofit2的简介以及特点 Retrofit2使用配置(导包,权限等) Retrofit2中常用的注解介绍 Retrofit2实现http网络访问 GE ...

  2. c#网络通信框架networkcomms内核解析 序言

    NetworkComms网络通信框架序言 networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章, ...

  3. c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池

    NetworkComms网络通信框架序言 本例基于networkcomms2.3.1开源版本  gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池 ...

  4. c#网络通信框架networkcomms内核解析之九 自定义处理方法的运行机制

    NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本  gplv3协议 我们自己写的处理方法都称之为自定义处理方法 比如,我们在服务器上写的与登陆相关的处理方法 ...

  5. c#网络通信框架networkcomms内核解析之八 数据包的核心处理器

    NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本  gplv3协议 我们先回顾一个 c#网络通信框架networkcomms内核解析之六 处理接收到的二进制 ...

  6. NetworkComms网络通信框架V3结构图

    NetworkComms网络通信框架序言 来自英国的c#网络通信框架,历时五年打造,由英国剑桥的2位工程师倾情开发,最新版本V3.x版本.

  7. 强大的网络通信框架(实现缓存)--第三方开源--volley

    Android Volley是Android平台上很好用的第三方开源网络通信框架.使用简答,功能强大. Android Volley的库jar包Volley.ja下载连接地址:Volley下载 下载后 ...

  8. 成熟的C#网络通信框架介绍——ESFramework通信框架

    (转自:http://www.cnblogs.com/zhuweisky/archive/2010/08/12/1798211.html) ESFramework通信框架是一套性能卓越.稳定可靠.强大 ...

  9. DotNetty网络通信框架学习之初识Netty

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

随机推荐

  1. 电子工程师需要了解的SMT贴片质量问题汇总(转)

    点胶工艺中常见的缺陷与解决方法 拉丝/拖尾 拉丝/拖尾是点胶中常见的缺陷,产生的原因常见有胶嘴内径太小.点胶压力太高.胶嘴离PCB的间距太大.贴片胶过期或品质不好.贴片胶粘度太好.从冰箱中取出后未能恢 ...

  2. MFC总结

    1.首先是ListControl 简介: 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁.直观,在实际应用中能为用户带来方便. ...

  3. CSS基础学习-6.CSS属性_列表、表格

  4. Q&A(一)

    1.四种常见的无监督式任务? 聚类.可视化.降维.关联规则学习 2.什么是核外学习? 核外算法可以处理计算机主内存无法应对的大量数据.它将数据分割成小批量,然后使用在线学习技术从这些小批量中学习. 3 ...

  5. docker run always

    https://www.cnblogs.com/kaishirenshi/p/10396446.html

  6. hive常用日期函数-模板

    已知日期 要求日期 语句 结果 本周任意一天 本周一 select date_sub(next_day('2016-11-29','MO'),7) ; 2016-11-28 本周任意一天 上周一 se ...

  7. Mybatis的@UpdateProvider注解的使用(转)

    废话不多说,直接上代码 @UpdateProvider(type = AppProvider.class, method = "updateApp") Integer update ...

  8. python 中pip配置清华源

    anaconda配置镜像 Mac and Linux conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda ...

  9. 【Winfrom-Button】 重写Button,去掉获取焦点时的边框

    Winfrom Button 去掉获取焦点时的边框: 自定义一个Button,重写ShowFocusCues方法 /// <summary> /// 去掉获取焦点的边框 /// </ ...

  10. 使用CSS3 will-change提高页面滚动、动画等渲染性能----------------------------引用

    Chris Ruppel当其使用background-attachment: fixed实现背景图片不随滚动条滚动而滚动效果的时候, 大家肯定会好奇,这到底施了什么魔法,可以让渲染提升如此之显著.3个 ...