AsyncHttpClient开源框架android-async-http还是很方便的。 AsyncHttpClient该类通常用在android应用程序中创建异步GET,

POST, PUT和DELETE HTTP请求,请求参数通过RequestParams实例创建,响应通过重写匿名内部类 ResponseHandlerInterface的

方法处理。

1、看代码上传文件

public void uploadFile(ArrayList sendFilesPath) {if (sendFilesPath.size() == 0) return ;String strUploadFile = mstrIP + mstrUploadFile;AsyncHttpClient client = new AsyncHttpClient();client.setURLEncodingEnabled(false);RequestParams params = new RequestParams();params.put("user_name", mstrUser);params.put("token", mstrCheckPass);params.put("dir_parent", "@sys");//批量上传for (int i = 0; i < sendFilesPath.size(); i++) {File myFile = new File(sendFilesPath.get(i));try {params.put(myFile.getName(), myFile);} catch (FileNotFoundException e1) {continue;}}client.setTimeout(10000);client.post(strUploadFile, params, new AsyncHttpResponseHandler() {@Overridepublic void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable arg3) {Log.i("Show", "upload failed");}@Overridepublic void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {String responseData = new String();responseData = new String(responseBody);try {JSONObject jsonObject = new JSONObject(responseData);int status = jsonObject.getInt("status");if (status == 1) {Log.i("Show", "upload 1");}} catch (Exception e) {}}        @Override          public void onProgress(int bytesWritten, int totalSize) {              super.onProgress(bytesWritten, totalSize);              int count = (int) ((bytesWritten * 1.0 / totalSize) * 100);              // 上传进度显示              progress.setProgress(count);              Log.e("上传 Progress>>>>>", bytesWritten + " / " + totalSize);          }            @Override          public void onRetry(int retryNo) {              super.onRetry(retryNo);              // 返回重试次数          } });}

2、删除服务器文件代码

public void deleteFile(final ArrayList needDeleteFilesPath) {if (needDeleteFilesPath.size() == 0)return;String strDeleteFile = mstrIP + mstrDeleteFiles;AsyncHttpClient client = new AsyncHttpClient();client.setURLEncodingEnabled(false);RequestParams params = new RequestParams();params.put("user_name", mstrUser);params.put("token", mstrCheckPass);params.put("dir_parent", "@sys");// 批量for (int i = 0; i < needDeleteFilesPath.size(); i++) {params.put("files_id", needDeleteFilesPath.get(i));client.setTimeout(10000);client.post(strDeleteFile, params, new AsyncHttpResponseHandler() {@Overridepublic void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable arg3) {Log.i("Show", "delete faile");}@Overridepublic void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {String  responseData = new String(responseBody);}});}}

3、使用使用HttpURLConnection断点续传下载文件

AsyncTask异步管理下载文件,使用HttpURLConnection断点续传。

TaskDownFile mDownFile = new TaskDownFile();mDownFile.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, url_downFile,fileName, String.valueOf(nDownID));
public class TaskDownFile extends AsyncTask {@Overrideprotected void onPreExecute() {}@Overrideprotected Boolean doInBackground(String... arg0) {String mFilePath;String urlString = arg0[0];String fileName = arg0[1];int nDownID = Integer.parseInt(arg0[2]);HttpURLConnection conn;if (mFileInfos == null || mFileInfos.size() <= 0)return false;try {File file = new File(mstrFilePath);if (!file.exists())file.mkdir();mFilePath = mstrFilePath + "/" + fileName;// 判断当前安装包路径下面是否有已经下载的文件, 如有则不下载,只需要MD5校验即可String checkApkFilePath = mstrFilePath + "/" + fileName;File checkApkFile = new File(checkApkFilePath);if (checkApkFile.exists()) {// MD5校验String md5 = md5sum(mFilePath);String fileTime = getFileDataTime(checkApkFile);// MD5校验是否文件相同,在根据时间判断if (md5.compareToIgnoreCase(mFileInfos.get(nDownID).md5) == 0)return true;else if (compareDataTime(fileTime,mFileInfos.get(nDownID).create_time) > 0) {mNumberList.add(nDownID);return true;} else {// 服务器文件最新, 删除本地文件checkApkFile.delete();}}// 临时安装文件检验, 是否续传文件mFilePath = mFilePath + ".temp";long haveDownLength = 0;File tempFile = new File(mFilePath);if (tempFile.exists())haveDownLength = tempFile.length();conn = (HttpURLConnection) new URL(urlString).openConnection();if (haveDownLength != 0)conn.setRequestProperty("Connection", "Keep-Alive");conn.setReadTimeout(6000);conn.setConnectTimeout(3000);conn.setChunkedStreamingMode(0);conn.setRequestMethod("GET");conn.connect();int fileSize = conn.getContentLength();long countRead = haveDownLength;if (fileSize > 0) {InputStream stream = conn.getInputStream();FileOutputStream fos = new FileOutputStream(mFilePath,haveDownLength > 0 ? true : false);int read = 0;fileSize += haveDownLength;byte buffer[] = new byte[1024];while ((read = stream.read(buffer)) >= 0) {countRead += read;fos.write(buffer, 0, (int) read);publishProgress((int) countRead, fileSize);}fos.flush();stream.close();fos.close();} else {fileSize = (int) haveDownLength;}conn.disconnect();if (countRead != fileSize)return false;int index = mFilePath.indexOf(".temp");if (index >= 1) {String tempFilePath = mFilePath.substring(0, index);File renameFile = new File(mFilePath);File toFile = new File(tempFilePath);renameFile.renameTo(toFile);mFilePath = tempFilePath;return true;}} catch (IOException e) {Log.i("Show", e.toString());return false;} finally {}return false;}@Overrideprotected void onPostExecute(Boolean isSuccess) {//下载后干什么}@Override protected void onProgressUpdate(Integer...values) {//进度条if (values[0] == null) return;downSize = values[0];fileSize = values[1];progress = (int) ((values[0] * 1.0 / values[1]) * 10000);mHandler.sendEmptyMessage(DOWNLOAD);}}

4、MD5检验文件

//文件md5获取public static String md5sum(String filename) {InputStream fis;byte[] buffer = new byte[1024];int numRead = 0;MessageDigest md5;try {fis = new FileInputStream(filename);md5 = MessageDigest.getInstance("MD5");while ((numRead = fis.read(buffer)) > 0) {md5.update(buffer, 0, numRead);}fis.close();return toHexString(md5.digest());} catch (Exception e) {System.out.println("error");return null;}}//十六进制转换成字符串public static String toHexString(byte[] b) {char HEX_DIGITS[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F' };StringBuilder sb = new StringBuilder(b.length * 2);for (int i = 0; i < b.length; i++) {sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);sb.append(HEX_DIGITS[b[i] & 0x0f]);}return sb.toString();}

使用AsyncHttpClient也是可以上传、下载、删除的。只不过下载不是很好用。

下载推荐使用HttpURLConnection,因为文件大的话,可以暂停下载,或者下载时候断了,可以重新接着下载。

MD5在文件下载检验也是很重要,看文件有没有丢失或者缺损。

下一章准备总结一下缓存txt数据,文件最后修改时间的比较,两个string数据的比较。








更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. Cocos2d Box2D 开发Android下的 Breakout 撞球游戏
  4. 系出名门Android(10) - HTTP 通信, XML 解析, 通过 Hander 实现
  5. Android(安卓)Studio 3.0 正式版本 发行说明 (翻译)
  6. Android(安卓)文件的上传
  7. Android(安卓)APK反编译查看源码及资源文件
  8. Android中音乐文件的信息详解【安卓源码解析二】
  9. Android设备与外接U盘实现数据文件夹拷贝到android设备

随机推荐

  1. xxx is not translated in yyy, zzz 的解
  2. Android通过路径获取URI(全版本)
  3. 【android】存储数组数据到SharedPrefere
  4. Android(安卓)使用HTTPClient调用Web请求
  5. Andoid自动判断输入是电话,网址或者Email
  6. Android(安卓)Aidl实现进程间通信
  7. 关于Android应用程序内存泄漏 你需要知道
  8. ListViewAnimations 源码浅析
  9. 从输入流中获取数据并以字节数组返回,这种
  10. Ubuntu12.10编译Android(安卓)4.0.3的常