Android中使用网络通信工具类

来源:互联网 发布:如何测试网络的连通性 编辑:程序博客网 时间:2024/05/17 09:12

/**
 * 无用的话 begin
 *
 * 做了两年的android,做了一年的MFC
 * 感觉没有很完整的技术积累,不知道用什么方式提升
 * 脑子里面乱七八糟,很不舒服的感觉
 * 决心用blog来记录自己用到的东西,给自己有个完整交代:)
 *
 * 无用的话 end
*/



现在大家在做应用的时候,很少还是单机的了=。=
毕竟网络这么发达,如果一个应用的数据很少变更,用的时间长了会降低新鲜感
so,对于一个正常的应用来说,有网络通信的功能是很基本的

网络通信要注意的东西很多:性能,效率,安全性,数据完整。。。
在一个工程中,为了方便使用,以及考虑代码的封装,维护等方面,很多情况下会考虑对网络通信进行封装,做成一个工具类来处理网络请求



抽取工具类嘛,大家都知道的,抽取共性部分,独特性的部分抽取接口,按流程调用
比如一个最简单的Http连接和读写包含:
  1.创立连接的对象(connection)         - 传入url地址
  2.向服务器请求的输出流(outputstream) - 传入各请求需要的request
  3.从服务器返回的输入流(inputstream)
  4.缓存返回的内容(data outputstream)  - 处理各接口返回的内容,获得response
  5.关闭输入输出流,释放资源


HttpConnectionBase
{
    ...
    HttpURLConnection conn = null;
    DataOutputStream dataOutputStream = null;
    InputStream inputStream = null;
    ByteArrayOutputStream byteOutputStream = null;
    
    try {
        URL url = new URL(mURL);
        conn = openHttpConnection(url);

        conn.setConnectTimeout(30000);
        conn.setReadTimeout(300000);
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.connect();
        
        dataOutputStream = new DataOutputStream(conn.getOutputStream());
        dataOutputStream.write(requestStr.getBytes("UTF-8"));
        dataOutputStream.flush();
        
        int resultCode = conn.getResponseCode();
        Log.d(TAG, "connection result : " + resultCode);
        if (HttpStatus.SC_OK == resultCode) {
            inputStream = conn.getInputStream();
            byteOutputStream = new ByteArrayOutputStream();
            
            byte[] buffer = new byte[1024];
            int len = 0;
            while (-1 != (len = inputStream.read(buffer))) {
                byteOutputStream.write(buffer, 0, len);
            }
            
            byte[] data = byteOutputStream.toByteArray();
            String jsonStr = new String(data, "UTF-8");
            result = readSuccessResult(jsonStr);
        } else {
            result = readResultFail();
        }
        
    } catch (Exception ex) {
        
    } finally {
        closeStreams(dataOutputStream, inputStream, byteOutputStream);
    }
}

其中【URL】,【request】,【response】可以作为抽象方法,根据对应的接口实现对应的功能方法
如果要使类在结构上看起来更清晰,可以新增requestBase,responseBase和jsonOperator这三个类,让接口和功能方法区别的更清楚


在网络请求的调用上,由于网络请求通常较为耗时,所以会考虑使用子线程来执行,在执行完成后,将结果返回给主线程
这样的做法又涉及到一部分设计模式的考虑,当然,可以直接使用Handler发送消息来执行,
但是在工程代码规模较大的时候,如果都使用这样的方式,在设计上看起来就没有那么优雅啦,而且对后期的维护也会造成很大的困扰


/*
 * 有点晚啦,明天继续,要是一天写完了,后面就没有动力啦:)
*/









0 0
原创粉丝点击