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

本文介绍了如何使用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();
        }
    });
}
}
<think>我们被要求使用中文回答,并且遵循特定的格式要求。同时,我们需要生成相关问题。 用户的问题:在Android开发中使用OkHttp和Retrofit进行网络请求,询问集成和使用方法。 根据提供的引用,我们可以总结如下: 引用[1]:介绍了Retrofit和OkHttp是Android网络请求的利器,它们相互配合使用。 引用[2]:详细说明了Retrofit使用步骤,包括创建Retrofit对象、定义接口、发起请求等,并提到Retrofit是在OkHttp基础上的封装。 引用[3]:展示了一个使用Retrofit创建网络请求接口实例的代码片段。 因此,我们的回答应该基于这些引用,并整合成清晰的步骤。 回答结构: 1. 引入:简要说明OkHttp和Retrofit的作用和关系。 2. 集成步骤:添加依赖。 3. 使用Retrofit和OkHttp的基本步骤: a. 创建OkHttpClient(可选,用于自定义配置) b. 创建Retrofit实例,并设置baseUrl、转换器等,可传入OkHttpClient实例。 c. 定义网络请求接口(使用注解)。 d. 创建接口实例,调用方法生成Call对象或使用RxJava等。 e. 发起请求(同步或异步)。 4. 代码示例:展示一个完整的示例。 5. 生成相关问题。 注意:根据引用[2],Retrofit默认会将请求结果抛回到主线程,所以我们不需要自己切换线程。 由于引用中提到了GsonConverterFactory,我们示例中使用Gson解析。 我们按照要求,行内公式用$...$,独立公式用$$...$$(但本问题可能不涉及数学公式,所以可以忽略,但若有变量名等,用行内格式,如$baseUrl$)。 另外,回答中引用的段落末尾添加引用标识。 开始回答:</think>### Android开发中集成OkHttp与Retrofit实现网络请求 #### 1. **添加依赖** 在`build.gradle`文件中添加依赖: ```gradle dependencies { // OkHttp implementation 'com.squareup.okhttp3:okhttp:4.9.3' // Retrofit + Gson解析 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' } ``` #### 2. **初始化OkHttpClient(可选)** ```kotlin val okHttpClient = OkHttpClient.Builder() .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) // 日志拦截器 .connectTimeout(30, TimeUnit.SECONDS) // 超时设置 .build() ``` #### 3. **创建Retrofit实例** ```kotlin val retrofit = Retrofit.Builder() .baseUrl("https://api.example.com/") // 基础URL .client(okHttpClient) // 绑定OkHttpClient .addConverterFactory(GsonConverterFactory.create()) // JSON解析 .build() ``` #### 4. **定义API接口** 使用注解声明请求方法: ```kotlin interface ApiService { @GET("users/{id}") fun getUser(@Path("id") userId: Int): Call<User> // 同步请求 @POST("login") fun login(@Body user: User): Call<LoginResponse> // 异步请求 } ``` #### 5. **发起网络请求** ```kotlin // 创建API实例 val api = retrofit.create(ApiService::class.java) // 异步请求示例 api.getUser(123).enqueue(object : Callback<User> { override fun onResponse(call: Call<User>, response: Response<User>) { if (response.isSuccessful) { val user = response.body() // 自动解析为User对象 textView.text = user?.name } } override fun onFailure(call: Call<User>, t: Throwable) { // 处理请求失败 } }) ``` #### 关键特性说明 1. **线程切换**:Retrofit自动将响应回调切换到主线程,无需手动处理[^2]。 2. **数据解析**:通过`GsonConverterFactory`实现JSON→对象的自动转换。 3. **拦截器扩展**:可通过OkHttp添加日志、缓存等拦截器(如引用[2]中的日志拦截优化)。 4. **请求类型支持**:支持`@GET`、`@POST`、`@Path`、`@Query`、`@Header`等注解配置请求。 > **注意**:Retrofit本质是OkHttp的高级封装,两者协同工作——OkHttp处理底层网络通信,Retrofit聚焦接口定义和数据转换[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值