Android-网络交互之客户端请求服务端资源-stoneson的专栏-  -  棒槌网@Android开发论坛 - Powered by phpwind

来源:互联网 发布:python使用指南 编辑:程序博客网 时间:2024/06/08 15:39



                    

                    

                    
最近那个茫然啊,工作不如意,感情不如意,感觉事事不顺,在android上又荒废了些时日。最近因为想做一个apk,主要涉及到网络方面的应用,所以也开始学习之前没怎么涉及到的模块。


今天实现要实现的其实很简单,通过网络获取服务端一个文件(可以是txt、png、mp3等等),因为之前是做c#开发的,所以操起老本行,模拟一个服务器,通过url去获取服务器的一个资源,就这么简单,所以大家千万千万不要被吓着,没有什么post请求、没有什么get请求,也就是说没有验证直接获取,所有这些post、get通通不涉及。


android中实现网络连接提供了三种接口以供我们使用:


1、标准java.net.*接口


2、org.apache.*接口


3、android.net.*接口


我的示例就是使用第一种接口来实现,来实现从服务器下载一个txt文档,我们要实现这个功能要通过几个步骤实现


1、在sdcard中创建一个文件,将网络流保存为txt的最终文本文件


2、实现网络连接,获取网络流,保存到sdcard中的txt文件中


3、新建线程下载服务器txt文档


4、模拟一个web服务器(c#)


第一步工作实现过程:首先验证sdcard状态(是否载入并且是否可以读写),其次获得(新建)文件目录和新建txt文件,最后初始化一个fileoutputstream对象,他就是实现从数据流到文件的关键纽带,还有sdcard操作权限。


参考:http://tdq222.javaeye.com/blog/701962
   代码:




代码

file dir
=
null
;
file file
=
null
;

if
(environment.getexternalstoragestate().equals(environment.media_mounted)){
    log.v(
"
tag
"
,
"
---------create file
"
);
    
//
获得sdcard目录

    dir
=
environment.getexternalstoragedirectory();
    
//
在指定目录新建文件

    file
=
new
file(dir,
"
test.txt
"
);
}
fileoutputstream fos
=
null
;

try
{
    fos
=
new
fileoutputstream(file);
}
catch
(filenotfoundexception e1) {
    
//
todo auto-generated catch block

    e1.printstacktrace();
}






代码

在sdcard中创建与删除文件权限
-->
  

uses-permission
android:name
="android.permission.mount_unmount_filesystems"
/>
  

往sdcard写入数据权限
-->
  

uses-permission
android:name
="android.permission.write_external_storage"
/>

第二步工作内容实现过程:首先创建url连接对象,其次配置连接属性(是否可以读取,连接超时、读取超时),最后打开连接获取数据流保存到文件,还有网络连接权限。参考:http://java-cofi.javaeye.com/blog/734185
代码:




代码

        
//
缓存

        
byte
[] bf
=
new

byte
[
8192
];
        
int
current
=
0
;
        
try
{
            
//
创建一个url对象

            url url
=
new
url(spec);
//
spec:资源连接地址

            httpurlconnection connect
=
(httpurlconnection)url.openconnection();
            
//
从服务端下载http资源,设置读取权限

            connect.setdoinput(
true
);

//
            
//
上传资源到服务端,设置写入权限

//
            connect.setdooutput(true);
            
//
设置连接服务器超时时间

            connect.setconnecttimeout(
5
*
1000
);
            
//
设置从服务器读取数据超时时间

            connect.setreadtimeout(
30
*
1000
);
            
//
获得网络连接状态码

            
int
code
=
connect.getresponsecode();
            
//
判断是否连接成功(httpurlconnection.http_ok==200,0-200都属正常)

            
if
(code
==
httpurlconnection.http_ok){

//
                
//
打开连接获取资源(不写也没关系,调用getinputstream()默认会打开连接


//
                connect.connect();

                inputstream is
=
connect.getinputstream();
                bufferedinputstream bis
=
new
bufferedinputstream(is);
                
while
((current
=
bis.read(bf))
!=-
1
){
                    fos.write(bf,
0
, current);
                }
                bis.close();
                fos.close();
                
//
断开连接

                connect.disconnect();
            }
            
        }
catch
(malformedurlexception e) {
            
//
todo auto-generated catch block

            e.printstacktrace();
        }
catch
(ioexception e) {
            
//
todo auto-generated catch block

            e.printstacktrace();
        }
  






代码

在sdcard中创建与删除文件权限
-->
  

uses-permission
android:name
="android.permission.mount_unmount_filesystems"
/>
  

往sdcard写入数据权限
-->
  

uses-permission
android:name
="android.permission.write_external_storage"
/>

第三步主要是为了不使下载资源时造成主ui堵塞




代码

    
private
handler handler
=
new
handler(){
        
public

void
handlemessage(message msg){
            
//
提示用户下载完成

            
if
(msg.what
==
1
){
                toast.maketext(main.
this
,
"
down succes
"
, toast.length_short).show();
            }
else
{
                toast.maketext(main.
this
,
"
down fail
"
, toast.length_short).show();
            }
            
super
.handlemessage(msg);
        }
    };

    @override
    
public

void
onclick(view v) {
        
//
todo auto-generated method stub

        log.v(
"
tag
"
,
"
------------onclick
"
);
        
//
开启下载线程

        thread thread
=
new
thread(
new
downthread());
        thread.start();
    }
    
    
class
downthread
implements
runnable{

        @override
        
public

void
run() {
            
//
todo auto-generated method stub
            
//
下载资源

            download();
            message msg
=
new
message();
            msg.what
=
1
;
            handler.sendmessage(msg);
        }
    }

第四步就简单了,新建一个网站提供一个链接就ok了例如:http://localhost:7643/website1/data/test.txt
,但是有一点要注意,将


localhost换成10.0.2.2,这就是本机的意思吧(未确认),至此从服务器获取资源就实现了,打开ddms中sdcard,把test.txt取出来,打开如图:








                    

本文转载至: http://blog.csdn.net/stoneson/archive/2010/12/01/6048107.aspx

推荐文章:
bitmap 对bitmap 的填充
不断加速的动画。。
android 对话框【dialog】去除白色边框代码
android中如何定义非7bit以外的收发数据短信?
极地星空之android的学习笔记i
android native c 实现 zip 的解压
android飞信短信箱程序源码讲解--转
manifest 文件简介
提高android应用程序的速度四大原则
java list 的遍历方法
viewgroup自绘背景导致view无法显示
俺也说说在windows下批量下载android源代码(用cygwin)
tab与tabhost
windows系统不用eclipse工具实现android apk程序编译及打包工具
android自动化测试学习积累贴
android开发
android编程
android教程
android资料下载
android sdk
android源代码
android教学
android入门
android开发视频
android系统

android开发论坛
棒槌网@Android相关文章推荐:
Android---网络交互之客户端请求服务端资源- stoneson的专栏-
Android资源帖- zhjp4295216的专栏-
android之后台线程(UI与线程交互) - xyz_lmn的专栏-
实用Android开发工具和资源精选- xiangyong2008的专栏-
访问android资源- fenghome的专栏-
Android中的资源与国际化! - Android_Tutor的专栏-
android 用HttpURLConnection读网络。 - marszszzl的专栏-
android来电查询界面之数据的获取(通过网络) - liuwenhan999的专栏 ...

原创粉丝点击