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数据。
输出结构为:

代码:https://pan.baidu.com/s/1Fpp4AyzRapV9FLST5fbJKg
Android Retrofit2 网路编程的更多相关文章
- Android中JNI编程的那些事儿(1)
转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...
- Android 框架式编程 —— 起篇
一般的,在开发的时候,写过的代码在需求变更后,发现需要改动非常多的地方,那么说明之前的代码的架构肯定是存在问题的. 下面我们结合面向对象的六大基本原则谈Android 框架式编程.首先先介绍一下面向对 ...
- Android 的网络编程
android的网络编程分为2种:基于socket的,和基于http协议的. 基于socket的用法 服务器端: 先启动一个服务器端的socket ServerSocket svr = new ...
- Android手机摄像头编程入门
本讲内容:Android手机摄像头编程入门智能手机中的摄像头和普通手机中的摄像头最大的区别在于,智能机上的摄像头可以由程序员写程序控制, 做一些有趣的应用譬如,画中画,做一些有用的应用譬如二维码识别, ...
- 《Android传感器高级编程》
<Android传感器高级编程> 基本信息 原书名:Professional Android Sensor Programming 原出版社: Wrox 作者: (美)米内特(Greg M ...
- Java复习9网路编程
Java 复习9网路编程 20131008 前言: Java语言在网络通信上面的开发要远远领先于其他编程语言,这是Java开发中最重要的应用,可以基于协议的编程,如Socket,URLConnecti ...
- (转载)android开发常见编程错误总结
首页 › 安卓开发 › android开发 android开发常见编程错误总结 泡在网上的日子 / 文 发表于2013-09-07 13:07 第771次阅读 android,异常 0 编辑推荐:稀 ...
- Android Studio NDK编程初探
继上一篇学习了如何使用NDK编译FFMPEG后,接下来就是要学习如何在Android Studio中使用了. 经过参考和一系列的摸索,记录下具体步骤. 创建C++ Support的Android St ...
- (转)android 蓝牙通信编程
转自:http://blog.csdn.net/pwei007/article/details/6015907 Android平台支持蓝牙网络协议栈,实现蓝牙设备之间数据的无线传输. 本文档描述了怎样 ...
随机推荐
- 【Linux】字符转换命令paste
这个 paste 就要比join 简单多了!相对于 join 必须要比对两个文件的数据相关性, paste 就直接『将两行贴在一起,且中间以 [tab] 键隔开』而已!简单的使用方法: [root@w ...
- JS遍历Table的所有单元格内容
用JS去遍历Table的所有单元格中的内容,可以用如下JS代码实现: 这个方法的参数是唯一标识Table的id,用document对象的获取. function GetInfoFromTable(ta ...
- MySQL-innodb_flush_log_at_trx_commit
有效取值为0.1.2.建议设置为1 -1:执行commit的时将重做日志缓冲区同步写到磁盘,即伴有fsync调用 -2:执行commit的时将重做日志异步写到磁盘,即先写到文件系统的缓冲中(因为文件系 ...
- tomcat启动报错 java.lang.ClassNotFoundException: org.apache.jsp.index_jsp
项目运行一直很平稳,但是换了tomcat之后打开jsp网页时就报错,描述如下: 1. 错误描述 打开jsp网页时报错 java.lang.NullPointerException org.ap ...
- Cadence 5141 下TSMC 05U工艺库安装
以下资料摘自:<T13RF PDK簡介>-張文旭 观念与TSMC工艺库的安装 管理者安裝TSMC 0.13 MS/RF的環境下之PDK的安裝方式相當容易,首先以root的方式進入Unix/ ...
- Knockout: 使用knockout validation插件进行校验, 给未通过校验的输入框添加红色边框突出显示.
之前整理了三篇帖子: Knockout: 使用CSS绑定和event的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示. http://www.cnblogs.com/liuzhend ...
- nginx 反向代理说明
1 在大型项目开发中,可能会有多个应用部署在不同机器上,如果想让用户访问单个域名或IP访问到这些应用,可以使用 nginx 的反向代理,将应用的地址通过 nginx 代理,用户通过访问 nginx 地 ...
- hackerrank-knapsack
https://www.hackerrank.com/challenges/unbounded-knapsack 题目描述: #include <iostream> #include &l ...
- [LintCode] N-Queens
N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...
- Android: 设置 app 字体大小不跟随系统字体调整而变化
在做 app 内字体大小的需求,类似于 微信中设置字体大小. 那么就需要 app 不跟随系统字体大小调整而变化,找到了两个方法. 方法1: 重写 getResource() 方法,修改 configu ...