Android Retrofit2网路编程实现方法详解

Android里面本身有OKHttp,不过不是很好用,这里就用Retrofit2,简单好用。

首先,需要加入网络权限:

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在build.gradle文件里加入引用包: Gson不用的话,就不需要添加

implementation 'com.squareup.okhttp3:okhttp:3.0.1'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

这时准备工作做完了。

先创建一个接口文件TestService

package controller.hzl.com.testclient;

import java.util.List;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.HTTP;
import retrofit2.http.POST;
import retrofit2.http.Path;
public interface TestService {
  @FormUrlEncoded
  @POST("getmacaddress")
  Call<ResponseBody> TestCall2(@Field("mobile") String mobile);

  @FormUrlEncoded
  @POST("getmacaddress")
  Call<MacAdress> TestCall3(@Field("mobile") String mobile);
}

这里的@POST("getmacaddress") 的getmacaddress 是URL除IP外的最后一个路径,可以理解为 IP+getmacaddress

这里用的是POST请求方式,@Field("mobile")为请求接口的参数。

写一个实体类模型,用来匹配接收的数据MacAdress

package controller.hzl.com.testclient;

public class MacAdress {
  private String resultMsg;

  public String getResultMsg() {
    return resultMsg;
  }

  public void setResultMsg(String resultMsg) {
    this.resultMsg = resultMsg;
  }

  public String getResultState() {
    return resultState;
  }

  public void setResultState(String resultState) {
    this.resultState = resultState;
  }

  public String getResultObj() {
    return resultObj;
  }

  public void setResultObj(String resultObj) {
    this.resultObj = resultObj;
  }

  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }
  public String getDelta() {
    return delta;
  }
  public void setDelta(String delta) {
    this.delta = delta;
  }
  private String resultState;
  private String resultObj;
  private String message;
  private String delta;
}

最后主MainActivity

package controller.hzl.com.testclient;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends Activity {
  private Button button1;
  private Button button2;
  private Button button3;
  private Button button4;
  private Button button5;
  private Button button6;
  private Button button7;
  private Button button8;
  private ImageView image;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button1 = (Button) findViewById(R.id.button1);
    button2 = (Button) findViewById(R.id.button2);
    button3 = (Button) findViewById(R.id.button3);
    button4 = (Button) findViewById(R.id.button4);
    button5 = (Button) findViewById(R.id.button5);
    button6 = (Button) findViewById(R.id.button6);
    button7 = (Button) findViewById(R.id.button7);
    button8 = (Button) findViewById(R.id.button8);
    image = (ImageView) findViewById(R.id.image); 

    button1.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View arg0) {
        GitHubServiceTest();
      }
    });

    button2.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View arg0) {
        IWeatherGetTest();
      }
    });
  }

  private void GitHubServiceTest() {
    Retrofit retrofit = new Retrofit.Builder()
      .baseUrl("http://115.29.190.99/api/meta/")
      .addConverterFactory(GsonConverterFactory.create())
      .build();

    TestService service = retrofit.create(TestService.class);

    //https://api.github.com/users/octocat/repos
    Call<ResponseBody> call = service.TestCall2("13296540788");
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
          // Get result bean from response.body()
          // List<Repo> repos = response.body();
          System.out.println(response.code());
          try {
            System.out.println(response.body().string());
            String jsonstr = new String(response.body().bytes());
            System.out.println("jsonstr="+jsonstr);
          }catch (Exception e){

          }

          // Get header item from response
          String links = response.headers().get("Link");
          showlog("links="+links);
          /**
           * 不同于retrofit1 可以同时操作序列化数据javabean和header
          */
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable throwable) {
          throwable.printStackTrace();
          //showlog(throwable.getCause().toString());
        }
      });
  }

  private void IWeatherGetTest() {
    {
      Retrofit retrofit = new Retrofit.Builder()
          .baseUrl("http://115.29.190.99/api/meta/")
          .addConverterFactory(GsonConverterFactory.create())
          .build();

      TestService service = retrofit.create(TestService.class);

      //https://api.github.com/users/octocat/repos
      Call<MacAdress> call = service.TestCall3("13296540788");
      call.enqueue(new Callback<MacAdress>() {
        @Override
        public void onResponse(Call<MacAdress> call, Response<MacAdress> response) {
          // Get result bean from response.body()
          // List<Repo> repos = response.body();
          System.out.println(response.code());
          try {
            System.out.println(response.body().getResultObj());
            System.out.println(response.body().getResultState());
          }catch (Exception e){

          }

          // Get header item from response
          String links = response.headers().get("Link");
          showlog("links="+links);
          /**
           * 不同于retrofit1 可以同时操作序列化数据javabean和header
           */
        }

        @Override
        public void onFailure(Call<MacAdress> call, Throwable throwable) {
          throwable.printStackTrace();
          //showlog(throwable.getCause().toString());
        }
      });
    }
  }

  public static void showlog(String info) {
     System.out.print("Retrofit " + info + "\n");
  }

}

这里的baseUrl("http://115.29.190.99/api/meta/") 就是URL的前面路径,加上@POST("getmacaddress") 的getmacaddress 其实就是 :http://115.29.190.99/api/meta/getmacaddress 请求的全路径。

两种方式:

TestCall2 是直接接收接收返回json的数据。

TestCall3 是用模型接收返回的json数据。

输出结构为:

代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android retrofit上传文件实例(包含头像)

    上传文件主要就是通过接口 1.AndroidMainfest.xml中加入权限 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android

  • Android如何通过Retrofit提交Json格式数据

    本文将介绍如何通过retrofit库post一串json格式的数据.首先post的json数据格式如下: { "Id": "string", "DeviceId": "string", "Name": "string", "SumDistance": 0, "RouteNo": "string", "SumPoints

  • Android使用 Retrofit 2.X 上传多文件和多表单示例

    retrofit post请求上传表单和文件最重要的就是就是去构建RequestBody,今天为大家带来一种超级简单的上传方式 Body方式: 1.Retrofit接口RetrofitInterface @POST(URLConstant.URL_PATH) Flowable<UploadImgBean> upload(@Body RequestBody Body); 2.Retrofit的配置 private static RetrofitInterface getRetrofitInter

  • Android中Retrofit的简要介绍

    Retrofit A type-safe HTTP client for Android and Java 适用于Java和Android的安全的HTTP客户端 Retrofit是一个可用于Android和Java的网络库,使用它可以简化我们的网络操作,提高效率和正确率.它将请求过程和底层代码封装起来只暴露我们业务中的请求和返回数据模型. public interface GitHubService { @GET("users/{user}/repos") Call<List&l

  • 基于Retrofit2+RxJava2实现Android App自动更新

    本文实例为大家分享了Retrofit2 RxJava2实现Android App自动更新,具体内容如下 功能解析 自动更新可以说已经是App的标配了,很多第三方平台也都支持这个功能,最近手头上的项目需要加入这个App自动更新,考虑到项目里有用到Retrofit2和RxJava2,于是打算使用它俩自己实现这个功能. 分析App自动更新,可以分为以下三个功能点: 1.APK文件的下载 2.下载进度的实时更新显示 3.下载完成后的自动安装 其中比较难的一点是下载进度的实时更新显示,更难的是如何优雅的进

  • Android Retrofit文件下载进度显示问题的解决方法

    综述 在Retrofit2.0使用详解这篇文章中详细介绍了retrofit的用法.并且在retrofit中我们可以通过ResponseBody进行对文件的下载.但是在retrofit中并没有为我们提供显示下载进度的接口.在项目中,若是用户下载一个文件,无法实时给用户显示下载进度,这样用户的体验也是非常差的.那么下面就介绍一下在retrofit用于文件的下载如何实时跟踪下载进度. 演示 Retrofit文件下载进度更新的实现 在retrofit2.0中他依赖于Okhttp,所以如果我们需要解决这个

  • Android中Retrofit 2.0直接使用JSON进行数据交互

    之前使用Retrofit都是将JSON串转化为POJO对象,针对不同的业务协议,定义相应的接口和参数列表.但是此种方式一般用在自己内部协议基础上,具体大的项目中,有些第三方的集成功能,一般都采用统一的方式即请求JSON和回应JSON进行数据交互,不可能每个第三方协议都会去定义与协议相应的POJO对象. HTTP肯定有GET和POST方法,先定义Retrofit Api的interface: package com.hdnetworklib.network.http; import java.ut

  • Android Retrofit实现多图片/文件、图文上传功能

    什么是 Retrofit ? Retrofit是Square开发的一个Android和Java的REST客户端库.这个库非常简单并且具有很多特性,相比其他的网络库,更容易让初学者快速掌握.它可以处理GET.POST.PUT.DELETE-等请求,还可以使用picasso加载图片. 一.再次膜拜下Retrofit Retrofit无论从性能还是使用方便性上都很屌!!!,本文不去介绍其运作原理(虽然很想搞明白),后面会出专题文章解析Retrofit的内部原理:本文只是从使用上解析Retrofit实现

  • Android Retrofit 中文乱码问题的解决办法

    Android Retrofit 中文乱码问题的解决办法 使用retrofit和rxjava,提交数据时需注意,当数据中有中文时,传到后台,可能会是乱码,需处理: 解决: 1.GET请求改成POST; 2.参数Field改成Query 3.加上@FormUrlEncoded 如下: @FormUrlEncoded @POST("/test/test") Call<Response> register(@Field("name") String name)

  • Android Retrofit2网路编程实现方法详解

    Android里面本身有OKHttp,不过不是很好用,这里就用Retrofit2,简单好用. 首先,需要加入网络权限: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission andro

  • Android 中RxPermissions 的使用方法详解

    Android 中RxPermissions 的使用方法详解 以请求拍照.读取位置权限为例 module的build.gradle: compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar' compile 'io.reactivex.rxjava2:rxjava:2.0.5' AndroidManifest.xml: <uses-permission android:name="android.permission.AC

  • Android中XUtils3框架使用方法详解(一)

    xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示.相信大家对这个框架也都了解过, 下面简单介绍下XUtils3的一些基本知识. XUtils3一共有4大功能:注解模块,网络

  • Android 中Context的使用方法详解

    Android 中Context的使用方法详解 概要: Context字面意思是上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄.很多方法需要通过 Context才能识别调用者的实例:比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用t

  • Android VideoCache视频缓存的方法详解

    Android VideoCache视频缓存的方法详解 项目中遇到视频播放,需要加载网络url,不可能每次都进行网络加载,当然了,就需要用到我们的缓存机制 AndroidVideoCache AndroidVideoCache是一个视频/音频缓存库,利用本地代理实现了边下边播,使用起来非常简单. HttpProxyCacheServer是主要类,是一个代理服务器,可以配置缓存文件的数量.缓存文件的大小.缓存文件的目录和缓存文件命名算法,文件缓存均基于LRU算法,利用Builder来配置: //配

  • Android 监听网络状态方法详解

    Android 监听网络状态方法详解 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission Android:name="android.permission.ACCESS_NETWORK_STATE" /> 二.判断手机网络的几个方案 1)判断是否有网络连接 public boolean isMobileConnected(Context context) { if (context != nul

  • Android 使用View Binding的方法详解

    前言 Android Studio稳定版发布了3.6版本,带来了一些新变化:首先外观,启动页变了,logo改了,更显现代化:增加Multi Preview功能,能同时预览多个尺寸屏幕的显示效果:模拟器支持多屏:也终于支持全新的视图绑定组件View Binding:等. 之前我们与视图交互的方式有findViewById.kotlin中引入Android Kotlin Extensions后直接通过id进行访问.前者模板化严重,重复代码多:后者最为方便.现在有了新的选择–View Binding,

  • Android ListView列表优化的方法详解

    目录 前言 优化点1:使用 builder构建列表 优化点2:禁用 addAutomaticKeepAlives 和 addRepaintBoundaries 特性 优化点3:尽可能将列表元素中不变的组件使用 const 修饰 优化点4:使用 itemExtent 确定列表元素滚动方向的尺寸 优化实例 总结 前言 列表 ListView 是应用中最为常见的组件,而列表往往也会承载很多元素,当元素多,尤其是那种图片文件比较大的场合,就可能会导致列表卡顿,严重的时候可能导致应用崩溃.本篇来介绍如何优

  • Android intent之间复杂参数传递方法详解

    本文详细讲述了Android intent之间复杂参数传递方法.分享给大家供大家参考,具体如下: Intent是Activity与Activity之间,Activity与Service之间传递参数的介质,而这两种通常实现的是Java基本对象类型和String的传递. 在实际项目中,页面之间传值,除了以上几种,经常还有传递Object对象.List类型.List<Object>类型和全局变量等等的需求.本文就是介绍怎么传递这几种类型的参数. 一.传递List<String>和List

  • Android控件ListView使用方法详解

    Android控件ListView使用方法介绍,具体如下 一.ListView的简单用法 首先新建一个ListViewTest项目,并让Android Studio自动创建好活动.然后修改activity_main.xml中的代码,如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

随机推荐