Android中网络框架简单封装的实例方法

Android中网络框架的简单封装

前言

Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能。访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库。由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架。如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会有大量的迁移工作要做。

封装网络框架

在架构设计中,面向接口和抽象,是解耦的一个重要原则。本文将基于这一原则,实现一个简单的网络框架封装。

定义网络访问的接口

抽取出不同网络框架的共同方法,定义成接口方法。

public interface IHttpLoader {

  /**
   * GET方式请求
   *
   * @param url
   * @param params
   * @param callback
   */
  void get(String url, Map<String, Object> params, IHttpCallback callback);

  /**
   * POST方式请求
   *
   * @param url
   * @param params
   * @param callback
   */
  void post(String url, Map<String, Object> params, IHttpCallback callback);

}

定义网络访问的Callback

public interface IHttpCallback {

  /**
   * 成功时的回调
   *
   * @param result
   */
  void onSuccess(String result);

  /**
   * 失败时的回调
   *
   * @param msg
   */
  void onFailed(String msg);

}

定义具体的接口实现类

分别对具体的网络框架进行接口实现,这里以Volley和OkHttp为例

Volley的实现类

public class VolleyHttpLoader implements IHttpLoader {

  private static RequestQueue mRequestQueue;

  public VolleyHttpLoader(Context context) {
    mRequestQueue = Volley.newRequestQueue(context);
  }

  @Override
  public void get(String url, Map<String, Object> params, final IHttpCallback callback) {
    StringRequest request = new StringRequest(Request.Method.GET, url,
        new Response.Listener<String>() {
          @Override
          public void onResponse(String s) {
            callback.onSuccess(s);
          }
        }, new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError volleyError) {
        callback.onFailed(volleyError.toString());
      }
    });
    mRequestQueue.add(request);
  }

  @Override
  public void post(String url, Map<String, Object> params, final IHttpCallback callback) {
    StringRequest request = new StringRequest(Request.Method.POST, url,
        new Response.Listener<String>() {
          @Override
          public void onResponse(String s) {
            callback.onSuccess(s);
          }
        }, new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError volleyError) {
        callback.onFailed(volleyError.toString());
      }
    });
    mRequestQueue.add(request);
  }
}

OkHttp的实现类

public class OkHttpLoader implements IHttpLoader {

  private static OkHttpClient mOkHttpClient;

  public OkHttpLoader() {
    mOkHttpClient = new OkHttpClient();
  }

  @Override
  public void get(String url, Map<String, Object> params, final IHttpCallback callback) {
    Request request = new Request.Builder().url(url).build();
    mOkHttpClient.newCall(request).enqueue(new Callback() {
      @Override
      public void onFailure(@NotNull Call call, @NotNull IOException e) {
        callback.onFailed(e.toString());
      }

      @Override
      public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
        if (response.isSuccessful()) {
          String result = response.body().string();
          callback.onSuccess(result);
        } else {
          callback.onFailed(response.message());
        }
      }
    });
  }

  @Override
  public void post(String url, Map<String, Object> params, final IHttpCallback callback) {
    RequestBody requestBody = appendBody(params);
    Request request = new Request.Builder().post(requestBody).url(url).build();
    mOkHttpClient.newCall(request).enqueue(new Callback() {
      @Override
      public void onFailure(@NotNull Call call, @NotNull IOException e) {
        callback.onFailed(e.toString());
      }

      @Override
      public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
        if (response.isSuccessful()) {
          String result = response.body().string();
          callback.onSuccess(result);
        } else {
          callback.onFailed(response.message());
        }
      }
    });
  }

  private RequestBody appendBody(Map<String, Object> params) {
    FormBody.Builder body = new FormBody.Builder();
    if (params == null || params.isEmpty()) {
      return body.build();
    }
    for (Map.Entry<String, Object> entry : params.entrySet()) {
      body.add(entry.getKey(), entry.getValue().toString());
    }
    return body.build();
  }
}

定义Callback的实现

public abstract class HttpCallback<Result> implements IHttpCallback {

  @Override
  public void onSuccess(String result) {
    Gson gson = new Gson();
    Class<?> clazz = analysisClazzInfo(this);
    Result resultObj = (Result) gson.fromJson(result, clazz);
    onSuccess(resultObj);
  }

  /**
   * 成功时的回调
   *
   * @param result
   */
  public abstract void onSuccess(Result result);

  private Class<?> analysisClazzInfo(Object object) {
    Type genType = object.getClass().getGenericSuperclass();
    Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
    return (Class<?>) params[0];
  }
}

返回的数据Bean

public class Data {

  private int errorCode;
  private String errorMsg;
  private List<DataBean> data;

  public int getErrorCode() {
    return errorCode;
  }

  public void setErrorCode(int errorCode) {
    this.errorCode = errorCode;
  }

  public String getErrorMsg() {
    return errorMsg;
  }

  public void setErrorMsg(String errorMsg) {
    this.errorMsg = errorMsg;
  }

  public List<DataBean> getData() {
    return data;
  }

  public void setData(List<DataBean> data) {
    this.data = data;
  }

  public static class DataBean {

    private int courseId;
    private int id;
    private String name;
    private int order;
    private int parentChapterId;
    private boolean userControlSetTop;
    private int visible;
    private List<?> children;

    public int getCourseId() {
      return courseId;
    }

    public void setCourseId(int courseId) {
      this.courseId = courseId;
    }

    public int getId() {
      return id;
    }

    public void setId(int id) {
      this.id = id;
    }

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    public int getOrder() {
      return order;
    }

    public void setOrder(int order) {
      this.order = order;
    }

    public int getParentChapterId() {
      return parentChapterId;
    }

    public void setParentChapterId(int parentChapterId) {
      this.parentChapterId = parentChapterId;
    }

    public boolean isUserControlSetTop() {
      return userControlSetTop;
    }

    public void setUserControlSetTop(boolean userControlSetTop) {
      this.userControlSetTop = userControlSetTop;
    }

    public int getVisible() {
      return visible;
    }

    public void setVisible(int visible) {
      this.visible = visible;
    }

    public List<?> getChildren() {
      return children;
    }

    public void setChildren(List<?> children) {
      this.children = children;
    }

    @Override
    public String toString() {
      return "DataBean{" +
          "courseId=" + courseId +
          ", id=" + id +
          ", name='" + name + '\'' +
          ", order=" + order +
          ", parentChapterId=" + parentChapterId +
          ", userControlSetTop=" + userControlSetTop +
          ", visible=" + visible +
          ", children=" + children +
          '}';
    }
  }

  @Override
  public String toString() {
    return "Data{" +
        "errorCode=" + errorCode +
        ", errorMsg='" + errorMsg + '\'' +
        ", data=" + data +
        '}';
  }

}

定义统一管理类

public class HttpHelper implements IHttpLoader {

  private static IHttpLoader mHttpLoader;

  private HttpHelper() {

  }

  public static void init(IHttpLoader httpLoader) {
    mHttpLoader = httpLoader;
  }

  public static HttpHelper obtain() {
    return HttpHelperHolder.INSTANCE;
  }

  static class HttpHelperHolder {
    private static HttpHelper INSTANCE = new HttpHelper();
  }

  @Override
  public void get(String url, Map<String, Object> params, IHttpCallback callback) {
    mHttpLoader.get(url, params, callback);
  }

  @Override
  public void post(String url, Map<String, Object> params, IHttpCallback callback) {
    mHttpLoader.post(url, params, callback);
  }
}

在Application中初始化

定义一个继承自Application的类,在onCreate方法中初始化网络访问

public class App extends Application {

  @Override
  public void onCreate() {
    super.onCreate();
//    HttpHelper.init(new OkHttpLoader());
    HttpHelper.init(new VolleyHttpLoader(this));
  }
}

后续如果需要切换网络框架,只需要在这里修改就可以了。

应用

public class MainActivity extends AppCompatActivity {

  private static final String URL_HTTP = "https://www.wanandroid.com/wxarticle/chapters/json";

  private ImageView mIv;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTv = findViewById(R.id.tv);

    findViewById(R.id.btn_get).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        HttpHelper.obtain().get(URL_HTTP, null, new HttpCallback<Data>() {
          @Override
          public void onFailed(final String msg) {
            runOnUiThread(new Runnable() {
              @Override
              public void run() {
                mTv.setText(msg);
              }
            });
          }

          @Override
          public void onSuccess(final Data data) {
            runOnUiThread(new Runnable() {
              @Override
              public void run() {
                mTv.setText(data.toString());
              }
            });
          }
        });
      }
    });

  }
}

结束

这里介绍的,其实只是一个封装的思路。基于这个思路,还可以封装常用的图片访问库等。可以自由拓展。

源码地址:https://github.com/milovetingting/Samples/tree/master/Loader

到此这篇关于Android中网络框架简单封装的实例方法的文章就介绍到这了,更多相关Android中网络框架的简单封装内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android动画工具类的封装实战记录

    起因 最近在做一个组件化框架的封装,现在开发到一些常用工具类的封装了,突然意识到好像还没有做动画的工具类,于是开始着手开发之. 思路 既然要做动画,肯定是要做属性动画的工具类的封装了,由于补间动画和逐帧动画并不能改变目标动画主题的实际属性,在Android的开发中已经越来越少人去用这两个动画框架做开发了,而属性动画则相对的越来越广泛的使用在开发过程中了,于是这次的工具类的封装,只针对属性动画来封装. 属性动画对应的类叫做ObjectAnimator,主要就是用这个类来实现动画的一些基础设置,其具

  • android6.0运行时权限完美封装方法

    前几天看了郭大神的运行时权限的专讲,深受启发,由于现在基于目前项目中的运行时权限封装的还不是那么完美,趁着郭神建议的还是历历在目.于是把它完整的敲了下来.并在此基础上添加上自己的一些见解,封装成一个完整的demo,希望与大家进行交流与. 在这里我进行了简单的在activity中简单进行获取权限和工具类封: 某一个权限被禁止或者是所有的权限被禁止,这里我做了去到烯烃界面去设置的处理: 如果要开启多个权限的话,则可能不同的手机显示的效果不同,有些手机在权限Dialog上显示需要获取权限的个数,但有些

  • Android中volley封装实践记录

    前言 在项目中一般使用使用volley方式如下,用起来给人一种很乱的感觉,于是一种盘它的想法油然而生. public void get() { String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=......"; StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<

  • Android中volley封装实践记录(二)

    前言 关于android的volley封装之前写过一篇文章,见链接(https://www.jb51.net/article/155875.htm).这篇文章主要是换种方式进行封装,具体步骤如下所示. 步骤如下 1.创建Request,并设置相应的参数: public class CommonJsonObjectRequest extends JsonObjectRequest { private String TAG = this.getClass().getSimpleName(); /*

  • Android中网络框架简单封装的实例方法

    Android中网络框架的简单封装 前言 Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能.访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库.由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架.如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会有大量的迁移工作要做. 封装网络框架 在架构设计中,面向接口和抽象,

  • Android中Volley框架进行请求网络数据的使用

    问题的阐述:Android SDK中的HttpClient和HttpUrlConnection两种请求方式用来处理网络的复杂的操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等: 解决:Volley就是为解决这些而生,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷:抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request.另外,Volley在不同的线程上异步执行所有请求而避免

  • Android 中Volley二次封装并实现网络请求缓存

    Android 中Volley二次封装并实现网络请求缓存 Android目前很多同学使用Volley请求网络数据,但是Volley没有对请求过得数据进行缓存,因此需要我们自己手动缓存. 一下就是我的一种思路,仅供参考 具体使用方法为: HashMap<String,String> params = new HashMap<>(); params.put("id", "1"); params.put("user", &quo

  • 详解Flutter中网络框架dio的二次封装

    其实dio框架已经封装的很好了,但是在实战项目中,为了项目可以统一管理,还是需要对dio框架进行二次封装. 整体思路:一般情况下,后台返回的数据我们可以分为两部分 1.状态数据 2.渲染数据 状态数据就是接口有没有正常返回数据相关的数据,这部分数据跟业务无关,我们可以封装起来统一管理,渲染数据就是我们渲染页面所需要的数据,这块的数据需要我们自己处理. 接下来我们就主要处理渲染数据这块的内容,我定义了两个函数,渲染数据可能为一个对象或者一个数组,我做了分别处理,定义两个函数来接受渲染数据. //

  • Android中XUtils3框架使用方法详解(一)

    xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示.相信大家对这个框架也都了解过, 下面简单介绍下XUtils3的一些基本知识. XUtils3一共有4大功能:注解模块,网络

  • 微信小程序之网络请求简单封装实例详解

    微信小程序之网络请求简单封装实例详解 在微信小程序中实现网络请求相对于Android来说感觉简单很多,我们只需要使用其提供的API就可以解决网络请求问题. 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downloadFile) WebSocket通信(wx.connectSocket) 为了数据安全,微信小程序网络请求只支持https,当然各个参数的含义就不在细说,不熟悉的话可以:可以去阅读官方文档的网络请求api,当我们使用request

  • Android中Volley框架下保持会话方法

    公司经理把我拉出来,死马当活马医,做一个安卓app,作为刚毕业几个月且只是培训了几个月的小白来说,这无疑是一个非常大的挑战,当然最大的挑战不是这个,最大的挑战时两个周做出来.这是最蛋疼的,说实话,对于有两三年的开发经验的人来说,两个周开发一个项目很简单,说不定还有很多时间用来干别的. 于是一上来就把自己给难住了,登陆还是很好做的,只要验证返回的信息就可以跳转,但是在接下来后面的数据接口连接的时候各种报错,整了两天,查了很多信息,还接受了公司老人的嘲讽和谩骂终于做出来了. 这个是基于session

  • Android中RecyclerView实现简单购物车功能

    Android中RecyclerView实现简单的购物车,供大家参考,具体内容如下 我们知道在ListView中用setTag来解决Item的复用问题,但是RecyclerView中已经帮我们封装好了复用,如果在项目中出现了RecyclerView的复用性问题时我们又该如何解决.先来看看效果图: 图片可能比较大也没有动态图片但效果是这样的!几天后就该有的都会有好了废话不说,进入正题 复用错误分析: RecyclerView设置数据源时加入了if判断,导致item重用时没有进入if判断.继续复用原

  • Android中Progress的简单实例

    Android中Progress的简单实例 Android中Progress网上的demo都是瞎扯淡,当然,你们也可以认为我的demo是瞎扯淡,因为,毕竟要理解别人的思路,很头疼,主要还是知道思路,然后一步一步慢慢来.今天我讲的是Progress的实现,如果看了我之前的博客,应该多少有些了解.话不多说,来看实例: xml东西不多,自己定义把,因为Progress包括了一级读取和二级读取,所以主要是根据按钮来实现,下面就是一个点击事件: public void onClick(View v) {

  • Android中AlertDilog显示简单和复杂列表的方法

    本文实例讲述了Android中AlertDialog显示简单和复杂列表的方法.分享给大家供大家参考,具体如下: AlertDialog 显示简单列表 setItems import Android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import andro

随机推荐