1. 程式人生 > >封裝Okhttp(Gson一起封裝在裡面減少了解析的操作)

封裝Okhttp(Gson一起封裝在裡面減少了解析的操作)

public class OkSingle {
    protected static Context context;
    private static OkSingle okSingle;
    private static OkHttpClient mOkHttpClient;
    private static Gson gson;

    private static final int SUCCESS = 1;
    private static final int FAILED = 0;

    public OkSingle(OkHttpClient okHttpClient) {
        if 
(okHttpClient == null) { mOkHttpClient = new OkHttpClient(); } else { mOkHttpClient = okHttpClient; } //獲取MyApplication的context context = MyApplication.context; gson = new Gson(); } public static OkSingle initClient(OkHttpClient okHttpClient) { if
(okSingle == null) { synchronized (OkSingle.class) { if (okSingle == null) { okSingle = new OkSingle(okHttpClient); } } } return okSingle; } //獲得單例的物件 public static OkSingle getInstance() { return
initClient(null); } public <T> void getRequestAsync(String url, final GetResponse.ErrorListener errorListener, final GetResponse.Listener<T> listener, final Class<T> tClass) { Request request = new Request.Builder().url(url).build(); //這種寫法,可以讓Handler指定屬於主執行緒 final Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SUCCESS: //成功時候的回撥 listener.onResponse((T) msg.obj); break; case FAILED: errorListener.onErrorResponse(); break; } } }; mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { errorListener.onErrorResponse(); } @Override public void onResponse(Call call, Response response) throws IOException { try { String result = response.body().string(); T t = gson.fromJson(result, tClass); Message message = handler.obtainMessage();//這種寫法比較省記憶體 message.what = SUCCESS; message.obj = t; handler.sendMessage(message); } catch (IOException e) { e.printStackTrace(); //因為是失敗,所以返回失敗,在主執行緒中判斷 handler.sendEmptyMessage(FAILED); } } }); } //自定義介面 public interface GetResponse { //成功的介面 interface Listener<T> { void onResponse(T response); } //失敗的介面 interface ErrorListener { void onErrorResponse(); } } }