最近那个茫然啊,工作不如意,感情不如意,感觉事事不顺,在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取出来,打开如图: