欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android+网络操作详解1  

程序员文章站 2022-05-07 09:04:58
...

我们在做ANDROID应用开发时,无非就两种,一种为单纯的C/S手机本地应用操作,一种就是通过网络操作,在手机本地应用操作相对来说是很简单的,但是要在网络上实现交互,这可能我需要学习与熟练更多的网路知识才能够做出比较好的在网络上进行交互的手机应用程序,下面,我就详细的为大家谈谈在通过ANDROID平台的客户端,我们怎么去与网络实现交互呢:

首先我们要知道在网络上实现交互,这也就关系到数据传输的问题,当然,只要有数据传输,就可能会考虑到数据格式问题,比如传输与接收端走的协议会不会出现乱码问题等,在这里,我首先讲讲关于比较平常的使用HTTP协议来对数据交互与处理的过程吧,简单的先看一个我们怎么通过网络来获取一张图片显示在手机自己的ANDROID手机上的小例子吧:首先我们需要通过手机的屏幕输入一个连接网络的路径地址, 如:http://img.blog.163.com/photo/HSBYOIG22ZqYMwn635TzkQ== /2272066012008814682.jpg,然后把它设置进对二进制流处理的方法里:byte[] datas = getImage(path),在这个方法我们是这样做:public static byte[] getImage(String path){首先我们要实例一个网络对象,即URL匹配地址:URL url = new URL(path);然后打开它:url.openConnection();并使用一个类似于浏览器的HttpURLConnection来对其连接:HttpURLConnection conn = url.openConnection();此时,我们似乎已经打开了对网络操作的通道,这时,我们需要去放入一些头参数信息对去请求校验:如连接超时信息:conn.setReadTimeOut(5);连接请求方式:conn.setRequestMethod("GET");在这里,由于我们只是发送请求头有信息,所以只需要使用GET方式方式就可以,有的人可能会有疑问,为什么不使用POST方式呢,这个我在后面会详细讲解到,当我们发送了这两个头信息后,我们要怎么知道我们的发送与连接是成功了的了,这是就需要网络服务对其做些反馈,然而网络服务是做了相应的返回对比信息的,如200是响应成功,404无服务文件等,还有一些相关的就请朋友之间去网络上查看一下了,在这里你可以使用HttpWatch工具对其详细查看的,如果有需要的朋友,可以在我的资源你下载,好了,我们就可以使用一个判断语句来得知服务的响应成功否:if(conn.getResponseCoed()==200){说明连接与响应成功,这时服务端就会通过网络以流的形式要求我们去就收,当然接收这个流,你可以对其包装接收也行,只不过都是你自己需要觉得做的事,自己想怎么做要看你自己的了,然而我们就直接以原始的二进制流来读取吧,当然,在这里我们需要考虑大一张图片可能比较大,所以需要使用缓冲的机制来读取,也就是把一部分线写入内存里,以链表的方式,想对去链表的头,后边的尾会有流继续写入,核心代码就是:InputStream inStream = conn.getInputStream();ByteArrayOutputStream outStream = new ByteArrayOutputStream();int len = 0;byte[] buffer = new byte[1024];while((len == inStream.readLine(buffer))!=-1){outStream.write(buffer,0,len);}}},获得了这个流的数据,我们该怎么显示在手机上呢,这其实很简单了,只是需要注意的是,格式问题,因为我们是以二进制流的方式读取获得的,所以我们保持时同样需要使用支持二进制格式的图片格式来接受与保存,如:byte[] datas = getImage();Bitmap bitmap = BitmapFactory.decoByteArray(data,0,data.length)来解码并以二进制位图来保存,这样据好做直接设置到显示图片的ImageView组件里就行了,这样可就实现了通过手机输入网络路径获取网络图片的全过程,这个过程其核心也就是使用了流缓冲机制,使其读取与显示过程更流畅,当然这只是一个简单网络操作,相对来说网络来操作不仅仅只是如此,在下来我们继续简单介绍一个例子,如网络源码查看器是在ANDROID 里是怎么实现的呢,其实与图片查看器的原理差不多,首先我们通过在ANDROID手机上使用EDITETEXT输入一个网络地址,即一个网络路径,然后在使用一个方法来单独处理这个路径的请求机制,同样我们可以使用URL来连接打开链接:url.openConnection();使用 HttpURLConnection去设置请求参数:conn.setReadTimeOut(5);conn.setRequestMethod("GET"),然后判断响应信息:conn.setResponseCode == 200的话就说明我们请求成功,并可以开始对接流的传输信息了,也就是说服务端的流已经对你打开了一个通道允许你去读取,这时候,你就可以使用 conn.getInputStream()来获取流,当然这是是以二进制方式传递的,为了接收方便,同样以二进制来接收:byte[] datas = conn.getInputStream();如果你以上面的方式直接操作的话,那就糟糕了,还是使用一个缓冲流的机制来做吧:ByteArrayOutputStream outStream = new ByteArrayOutStream();int len;byte[] buffer = new byte[1024];while((len = conn.getInputStream().read(buffer))!=-1) {outStream.write(buffer,0,len);},OK,这样就可以全权获得了你想要的流信息,以String方式进行保存起来吧:new String(datas,"gb2312"),记得不要忘了编码格式,不然会有乱码哦,最后保存进你的TEXTVIEW里面显示看看吧.我会时常上传一些源码,包括我们在这些内容中讲解的知识点,希望大家都能动手去实践一下,不然你的收获会很小的.....下一节,我继续以案例来讲解....