Retrofit 单例模式 联网工具类 简单使用

导入依赖

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();
        }
    });
}
}

猜你喜欢

转载自blog.csdn.net/qq_43143884/article/details/83755848
今日推荐