1. 程式人生 > >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();
        }
    });
}
}