国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android OKHTTP的單例和再封裝的實(shí)例

2019-12-12 02:21:57
字體:
供稿:網(wǎng)友

Android OKHTTP的單例和再封裝的實(shí)例

/** * Created by zm on 16-2-1 * okhttp的再封裝,對(duì)于2.x版本,3.x版本將原有對(duì)okhttpclient配置 * 改成了builder模式配 * 置,對(duì)于超時(shí)、代理、dns,okhttp已經(jīng)做好了配置, * 若不需要特殊配置,可以跳過 */public class OkHttpUtil{  private static OkHttpClient singleton;  //非常有必要,要不此類還是可以被new,但是無法避免反射,好惡心  private OkHttpUtil(){  }  public static OkHttpClient getInstance() {    if (singleton == null)    {      synchronized (OkHttpUtil.class)      {        if (singleton == null)        {          singleton = new OkHttpClient();        }      }    }    return singleton;  }}

之前在看okhttp源碼的時(shí)候,發(fā)現(xiàn)square沒有對(duì)okhttpclient進(jìn)行單例,網(wǎng)上也沒找到合適的解釋,以下是自己的猜測(cè)

優(yōu)點(diǎn):使用單例模式,避免了多次創(chuàng)建所產(chǎn)生的垃圾

缺點(diǎn):對(duì)于一些特殊需求的代碼進(jìn)行一些靈活的配置,單例模式難以實(shí)現(xiàn)

總結(jié):做為優(yōu)秀的開源框架,square出發(fā)點(diǎn)是讓用戶更好更靈活的使用和擴(kuò)展,從用戶角度來說,對(duì)于不需要多次配置的項(xiàng)目,可以手動(dòng)寫一個(gè)單例模式,便于內(nèi)存的高效利用

/** * okhttp再次封裝 * Created by zm on 16-2-1 * update by zm on 16-3-19 增加Builder,方便以后內(nèi)容或者字段的擴(kuò)展 *  */public class HttpTools{  private Context context;  private final RequestParams req;  private final Handler handler;  public HttpTools(Builder builder)  {    // TODO Auto-generated constructor stub    context = builder.context;    req = builder.req;    handler = builder.handler;  }  public static class Builder  {    private final RequestParams req;    private final Context context;    private final Handler handler;    public Builder(RequestParams req, Context mContext, Handler handler)    {      // TODO Auto-generated constructor stub      this.req = req;      this.context = mContext;      this.handler = handler;    }    public HttpTools build() {      return new HttpTools(this);    }  }  public void requestBuilder() {    // TODO Auto-generated method stub    if(req==null||context==null||handler==null){      throw new NullPointerException("NullPointerException");    }    requestGet(req, context, handler);  }  private static void parse(Call call, final Handler handler,      final RequestParams req) {    // 請(qǐng)求加入調(diào)度    call.enqueue(new Callback()    {      @Override      public void onResponse(Call call, Response response)          throws IOException {        // TODO Auto-generated method stub        String result = response.body().string();        if (result != null)        {          Message message = Message.obtain();          message.obj = result;          message.what = req.getSuccessMsgWhat();          handler.sendMessage(message);        }      }      @Override      public void onFailure(Call call, IOException e) {        // TODO Auto-generated method stub        handler.sendEmptyMessage(req.getFailMsgWhat());      }    });  }  /**   *    * @param req   * @param context   * @param handler   *    *      get請(qǐng)求   */  public static void requestGet(final RequestParams req,      final Context context, final Handler handler) {    // 創(chuàng)建一個(gè)Request    final Request request = new Request.Builder().url(req.getRequestUrl()).build();    Call call = OkHttpUtil.getInstance().newCall(request);    parse(call, handler, req);  }  /**   * post請(qǐng)求   */  public static void requestPost(final RequestParams req,      final Context context, final Handler handler) {    FormBody.Builder builder = new FormBody.Builder();    //此處是對(duì)RequestParams的遍歷,RequestParams類省略    for (Map.Entry<String, Object> mEntry : req.getParamEntry())    {      String mEntryKey = mEntry.getKey();      Object mEntryValue = mEntry.getValue();      if (TextUtils.isEmpty(mEntryKey))      {        continue;      }      builder.add(mEntryKey, mEntryValue.toString());    }    RequestBody body = builder.build();    Request request = new Request.Builder().url(req.getUrl()).post(body).build();    Call call = OkHttpUtil.getInstance().newCall(request);    parse(call, handler, req);  }  /**   *      數(shù)據(jù)請(qǐng)求的集中管理,方便以后一鍵替換,從get到post   */  public static void request(RequestParams req, Context mContext,      Handler handler) {    // TODO Auto-generated method stub    requestGet(req, mContext, handler);  }}

最后再奉獻(xiàn)上一個(gè)封裝類

/** *  * Created by zm on 16-2-1 * 基于Gson的json轉(zhuǎn)model封裝類 * */public class JsonToModel{private static String info = "info";  public static String getInfo()  {    return info;  }  public static void setInfo(String info)  {    JsonToModel.info = info;  }  /**   *    * @param msg   * @param t   *      model類   * @param model   *      model對(duì)象   * @return   */  public static <T> List<T> getJsonArrayToModel(Message msg, Class<T> t,      T model) {    // TODO Auto-generated method stub    List<T> list = new ArrayList<T>();    try {      JSONObject json = new JSONObject(msg.obj.toString());      for (int i = 0; i < json.getJSONArray(getInfo()).length(); i++) {        model = GsonHelper.toType(json.getJSONArray(getInfo()).get(i).toString(), t);        list.add(model);      }      return list;    } catch (Exception e) {      // TODO Auto-generated catch block      Log.e("getJsonArrayToModel", "error");      e.printStackTrace();    }    return null;  }}

json轉(zhuǎn)model的這個(gè)類中,當(dāng)時(shí)沒考慮到過多性能的問題,在此類中即使用了org.json.JSONObject也使用了gson,此處還可以做出相應(yīng)的優(yōu)化

如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 农安县| 赤峰市| 阳西县| 秦皇岛市| 凤山市| 拉萨市| 鞍山市| 诏安县| 白朗县| 土默特左旗| 沅江市| 府谷县| 贵德县| 柯坪县| 习水县| 资阳市| 秭归县| 肥西县| 乌拉特后旗| 武义县| 中西区| 肥西县| 汉寿县| 始兴县| 山西省| 海林市| 奉节县| 洛川县| 阿拉善左旗| 千阳县| 双城市| 桦川县| 东港市| 民勤县| 聂荣县| 缙云县| 永福县| 山阳县| 铜川市| 伊春市| 威海市|