Android下的联网下载的操作_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Android下的联网下载的操作

Android下的联网下载的操作

 2013/10/30 17:12:51  安卓吧  博客园  我要评论(0)
  • 摘要:一:从网络下载图片MainActivity:NetService1.由路径获取Url2.使用url打开HttpURLConnection连接3.根据路径查找本地sd卡是否有缓存文件,如果文件存在,发送最后修改时间Filefile=newFile("/mnt/sdcard/"+URLEncoder.encode(path,"UTF-8"));conn.setIfModifiedSince(file.lastModified());4.得到响应返回码,如果返回码是200,则正确得到网络连接5
  • 标签:android 下载 操作

一:从网络下载图片

MainActivity:

 

 

NetService

 1.由路径获取Url

2.使用url打开HttpURLConnection连接

3.根据路径查找本地sd卡是否有缓存文件,如果文件存在,发送最后修改时间

File file = new File("/mnt/sdcard/" + URLEncoder.encode(path, "UTF-8"));

conn.setIfModifiedSince(file.lastModified());

4.得到响应返回码,如果返回码是200,则正确得到网络连接

5.由连接获取输入流,将输入流写入到内存,由于是图片,所以为byte,

6.将内存中的数据赋给byte数组data,

7.用Bitmap的解码工厂将数据解码为图片

Bitmap image = BitmapFactory.decodeByteArray(data,0,data.length);

8,为了以后省流量,快速访问,将此图片缓存到本地

二:登录:

 classicLogin:

  点击登录时开始新线程

     1.获得用户名与密码

 2.调用服务层的方法为用户名与密码设置编码

Service.post(username,password)

     3.若无异常提示成功,否则提示失败

 

服务层的方法:

1.设置处理用户名与密码的Servlet路径:

  private String path = "http://192.168.1.100:8080/05.Web/LoginServlet"

 

1.post方法:

  1.Creates a new URL instance by parsing spec.

     URL url = new URL(path);

  2.获取HttpURLConnection连接

  3.设置连接超时时间

  4.设置请求方法为post

  5.设置三个请求头

        conn.setRequestProperty("Content-Type""application/x-www-form-urlencoded");

conn.setRequestProperty("Content-Length", params.getBytes().length + "");

conn.setRequestProperty("Host""192.168.1.100:8080");

   6.Sets the flag indicating whether this URLConnection allows output

conn.setDoOutput(ture);

   7.将得到的用户名密码编码后输出
username = URLEncoder.encode(username,"utf-8")

conn.getOutputStream().write(username.getBytes());

 8.得到响应码,若响应码不是200,则抛出异常。

 

3.get方式:

1.get方式是:http://192.168.1.100:8080/05.Web/LoginServlet?username=xxx&password=xxx

所以在创建URL时应遵照这种格式:

String path =  "http://192.168.1.100:8080/05.Web/LoginServlet";

String params = "username=" + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8");

URL url = new URL(path + "?" + params);

2.打开HttpURLConnection连接

3.设置连接超时时间

4.设置请求方法

5.开始连接,得到返回码

6.根据返回码判断网络状态

4.牛逼的方式:

常见的麻烦的方法已经有人写好了,自己可以直接拿来调用:

1.MainActivity

private AsyncHttpClient client = new AsyncHttpClient();

2.在点击登录时调用clientpostget方法即可:

client.post(url, params, responseHandler)

client.get(url, params, responseHandler)

三:上传:

   上传这种常见的麻烦的方法也被同一个牛逼人物写好了,同上,直接调用

类似的,把将要上传的文件也放入params:

     RequestParams params = new RequestParams();

     params.put("username", username);

     params.put("password", password);

 params.put("upload"new File(upload));

 

client.post(url, params, new AsyncHttpResponseHandler();

四:下载

1.java中最简单的下载

1.找到文件所在的路径:

URL url = new URL(http:xxxx/xx.txt);

2.打开http连接

3.设置连接超时时间

4.设置请求方式

5.开始连接得到响应码

6.响应码正确(200)则将由连接得到的输入流中的数据写入到本地

2.多线程下载:

     一:DownloadTask:继承Thread,规定线程数THREAD_AMOUNT = 3;

1.DownloadTask构造函数中传入下载地址,从下载地址中截取文件名

2.run方法

a) :打开连接,设置超时时间

b) :获取文件长度 :conn.getConntentLength();

c) :计算每个线程要下载的长度

d) :开启所有线程,每个线程会下载一部分数据到本地文件中

New DownloadThread(i).start();

       二:内部类DownloadThread:继承Thread,构造函数中传递的参数用来标记下载任务中的线程

        1.run方法:

a) :设置当前线程要下载的起始位置,结束位置

b) :当前线程打开Http连接,设置超时时间,设置请求下载的范围

c) :用随机读写文件地文件读写,此时同单线程下载操作

3.多线程断点续传:

 在多线程的基础上修改:添加一个临时文件记录当前线程下载到了哪一个字节了,然后下次再启动时,直接从当前临时文件所记录的地方接着下载.

:BPDownloadTask中的修改

   a) :BPDownloadTask的构造函数中创建临时文件.

       b) :run方法启动时,要判断临时文件是否存在,若不存在,则写入每个线程的开始位置

       c) :开启线程,每个线程会下载一部分数据到本地文件中

 二:在内部类DownloadThread中的修改

 A):run方法中创建记录进度的临时文件.

RandomAccessFile tempRaf = new RandomAccessFile(tempFile"rws");

 B):根据当前线程的id将指针移动到当前线程的位置读取当前线程已完成的数据

tempRaf.seek(id * 4);

C):多个下载进程之间同步,统计所有线程总共完成了多少

synchronized(BPDownloadTask.this) {

totalFinish += threadFinish;

}

D):计算当前线程起始位置,结束位置,后续同多线程下载.

发表评论
用户名: 匿名