一:从网络下载图片

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.在点击登录时调用client的post或get方法即可:

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):计算当前线程起始位置,结束位置,后续同多线程下载.

Android下的联网下载的操作的更多相关文章

  1. 在Android下通过ExifInterface类操作图片的Exif信息

    什么是Exif 先来了解什么是Exif.Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.I ...

  2. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  3. ubuntu14.04下 Android虚拟机 genymotion 的下载和安装

    官网:https://www.genymotion.com/ Install Guide https://www.genymotion.com/#!/developers/user-guide#ins ...

  4. android下获取无线wif信号、ssid、MAC等操作类

    一个android下获取无线wif信号.ssid.MAC等操作的类. WifiAdmin.java package com.afu; import java.util.List; import and ...

  5. Android下数据库操作——增删改查

    Android下数据库第一种方式增删改查     1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个SqliteDatebase对象     2.使用SqliteDat ...

  6. Android下OpenCV的环境搭建

    目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...

  7. Android与OpenCV——重新下载安装和OpenCV匹配的Android开发环境

    Android与OpenCV——重新下载安装和OpenCV匹配的Android开发环境 !!OpenCV4Android开发之旅(一)----OpenCV2.4简介及 app通过Java接口调用Ope ...

  8. Android下的Linux指令集

    Android目录结构 data app:用户安装的应用 data:应用的专属文件夹 system:系统的配置信息,注册表文件 anr:anr异常的记录信息 dev:devices的缩写 存放设备所对 ...

  9. Android开发多线程断点续传下载器

    使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点 ...

随机推荐

  1. 微信小程序 - cb回调(typeof cb == "function" && cb(obj);)

    typeof cb == "function" && cb(obj) 但凡用了Promise,这种方式就可以抛弃了. Page({ data: {}, onLoad ...

  2. 微信小程序 - 下拉菜单组件

    使用: 1.导入组件 2.使用组件 3.数据传入 4. 获取数据(通过同步缓存,获取“choose”)- 发送到后端 点击下载:小程序-下拉组件.

  3. Stingray验证机制

    Filter 系统中的验证使用的是Filter库来完成,利用Filter配置几个属性和参数就实现了表单验证,简化了工作.基本原理很简单,在onload之后按照属性查找元素,然后绑定相应的change/ ...

  4. 【Python】文件读写操作

    Python的文件读写有点类似php的文件读写.php的文件读写已经在<[php]让记事本成为你调控变量的控制台>(点击打开链接)说过了,以下用一个小样例说明Python的文件读写. 在F ...

  5. http协议版本历史

    1.http 0.9 2.http 1.0 3. http 1.1 4.http 2.0 推送:主动发送js.css推送到浏览器. 二进制流:可以并行发送数据. 2019.3.18补充: (1)htt ...

  6. UVALive - 4618 Wormholes(负环)

    题目大意:给出出发点和终点和m个虫洞(虫洞的出发点.终点,生成时间和花费时间).问从起点到终点花费的最小时间 解题思路:关键是有负环,所以直接跑最短路算法的话会TLE.所以负环要处理一下 可是这个负环 ...

  7. mvn test

    mvn -B install -Dmaven.test.skip=true -Dautoconfig.skipmvn -B org.codehaus.mojo:cobertura-maven-plug ...

  8. Kinect2.0骨骼跟踪与数据平滑

    Kinect v1和Kinect v2传感器的配置比较:   Kinect v1 Kinect v2           颜色(Color) 分辨率(Resolution) 640×480 1920× ...

  9. Pinpoint - 应用性能管理(APM)平台实践之部署篇

    0.0 前言 国内的APM行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的APM企业,例如APPdynamic,Dynamic,NewRelic ...

  10. [JavaScript模块演化简史]摘要

    来源于:https://zhuanlan.zhihu.com/p/26231889 # JavaScript 模块化 早期的JavaScript并没有模块化解决方案.随着单页应用与富客户端的流行,出现 ...