导入依赖
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
先写一个接口
import java.util.Map;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
public interface RetrofitService {
//注解@get post call 泛型 resPonse body get 括号字符型网址 加注解前面 map集合 泛型两个字符串 加查询集合注解 map
@GET
Call<ResponseBody> get(@Url String url, @QueryMap Map<String,String> map);
@POST
Call<ResponseBody> post(@Url String url,@QueryMap Map<String,String> map);
}
在写工具类
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class RetrofitUtils {
private static RetrofitUtils retrofitUtils;
private Retrofit retrofit;
private RetrofitListener retrofitListener;
//单利模式
//本类的构造方法改成私有的
private RetrofitUtils() {
}
//公共静态的本类 get 本类名
public static RetrofitUtils getRetrofitUtils(){
//判断提上去的本类为空
if (retrofitUtils==null){
//new 本类 返回值 提上去
retrofitUtils = new RetrofitUtils();
}
//直接返回提上去的本类名
return retrofitUtils;
}
//公共的初始化方法 不传东西
public void init(){
//new retrofit 返回值 提上去 在builder .base网址 .引号网址域名 后面加/ 。build 提交
retrofit = new Retrofit.Builder().baseUrl("域名+/").build();
}
//公共的本类 get 方法 括号里传接口get 传的数据
public RetrofitUtils get(String url, Map<String,String> map){
//判断集合为空
if(map==null){
//直接map=new hasmap 泛型空
map=new HashMap<>();
}
//调用初始化方法里的retrofit 新建 括号里调用接口 .get 括号里传网址和map 集合.enqueue 括号new 快捷键
retrofit.create(RetrofitService.class).get(url,map).enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//成功方法
//用传进来的response .body .小写字符串 先抓异常 在返回值
try {
String s = response.body().string();
//去下面定义接口回调
//调用接口成功方法 传字符串
retrofitListener.success(s);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//失败方法
//调用接口失败方法
retrofitListener.fail();
}
});
//记得返回this
return this;
}
//post 赋值上面的 改两个post
//公共的本类 get 方法 括号里传接口get 传的数据
public RetrofitUtils post(String url, Map<String,String> map){
//判断集合为空
if(map==null){
//直接map=new hasmap 泛型空
map=new HashMap<>();
}
//调用初始化方法里的retrofit 新建 括号里调用接口 .get 括号里传网址和map 集合.enqueue 括号new 快捷键
retrofit.create(RetrofitService.class).post(url,map).enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//成功方法
//用传进来的response .body .小写字符串 先抓异常 在返回值
try {
String s = response.body().string();
//去下面定义接口回调
//调用接口成功方法 传字符串
retrofitListener.success(s);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//失败方法
//调用接口失败方法
retrofitListener.fail();
}
});
//记得返回this
return this;
}
//回调接口方法
public void result(RetrofitListener retrofitListener){
//接口 返回值 this. 提上去
this.retrofitListener = retrofitListener;
}
//定义接口
public interface RetrofitListener{
//成功方法传字符串
void success(String s);
//失败方法 不穿值
void fail();
}
}
在主页面调用
一定要记得先初始化工具类 否则会崩
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button bt;
private String url1="全部网址";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//先初始化工具类
RetrofitUtils.getRetrofitUtils().init();
//获取控件强转提上去
bt=(Button)findViewById(R.id.bt);
//点击事件
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//请求网络数据方法
dohttp();
}
});
}
private void dohttp() {
//直接调用工具类 map 没有就传空
RetrofitUtils.getRetrofitUtils().get(url1,null).result(new RetrofitUtils.RetrofitListener() {
@Override
public void success(String s) {
//吐司成功
Toast.makeText(MainActivity.this,"成功"+s,Toast.LENGTH_SHORT).show();
}
@Override
public void fail() {
//吐司失败
Toast.makeText(MainActivity.this,"失败",Toast.LENGTH_SHORT).show();
}
});
}
}