自定义下载的封装实现
2017-08-29 22:51
267 查看
DownloadHelper.java
MainActivity.java
package com.studio.asynctaskproject; import android.os.AsyncTask; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; /** * 1. download方法 url localPath listener * 2.listener:start success fail progress * 3.用asynctask封装的 * Created by Administrator on 2017/8/29. */ class DownloadHelper { static void download(String url, String localPath, OnDownloadListener listener) { DownloadAsyncTask task = new DownloadAsyncTask(url, localPath, listener); task.execute(); } private static class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> { String mUrl; String mFilePath; OnDownloadListener onDownloadListener; DownloadAsyncTask(String mUrl, String mFilePath, OnDownloadListener onDownloadListener) { this.mUrl = mUrl; this.mFilePath = mFilePath; this.onDownloadListener = onDownloadListener; } /** * 在异步任务之前,在主线程中 */ @Override protected void onPreExecute() { super.onPreExecute(); //可操作UI 之前的准备工作 if (onDownloadListener != null) { onDownloadListener.onStart(); } } /** * 在另外一个线程中处理事件 * * @param strings 入参 * @return 结果 */ @Override protected Boolean doInBackground(String... strings) { String apkUrl = mUrl; try { //构造URL URL url = new URL(apkUrl); //构造链接,并打开 URLConnection urlConnection = url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); //获取了下载内容的总长度 int contentLength = urlConnection.getContentLength(); //对下载地址进行处理 File apkFi 4000 le = new File(mFilePath); if (apkFile.exists()) { boolean result = apkFile.delete(); if (!result) { if (onDownloadListener != null) { onDownloadListener.onFail(-1, apkFile, "文件删除失败"); } return false; } } //已下载的大小 int downloadSize = 0; //byte数组 byte[] bytes = new byte[1024]; int length; //创建一个输入管道 OutputStream outputStream = new FileOutputStream(mFilePath); //不断的从网络读取字节到byte数组再写入文件中 while ((length = inputStream.read(bytes)) != -1) { //读取的字节放到文件管道里 outputStream.write(bytes, 0, length); //累加下载进度 downloadSize += length; //发送进度 publishProgress(downloadSize * 100 / contentLength); } inputStream.close(); outputStream.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); if (onDownloadListener != null) { onDownloadListener.onFail(-2, new File(mFilePath), e.getMessage()); } return false; } if (onDownloadListener != null) { onDownloadListener.onSuccess(0, new File(mFilePath)); } return true; } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); //在UI线程中,执行结果 处理 } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); //收到进度,然后处理: 在UI线程中 if (values != null && values.length > 0) { if (onDownloadListener != null) { onDownloadListener.onProgress(values[0]); } } } } public interface OnDownloadListener { void onStart(); void onSuccess(int code, File file); void onFail(int code, File file, String message); void onProgress(int progress); abstract class SimpleDownloadListener implements OnDownloadListener { @Override public void onStart() { } @Override public void onProgress(int progress) { } } } }
MainActivity.java
package com.studio.asynctaskproject; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; /** * 1. 网络上请求数据:申请网络权限 读写存储权限 * 2. 布局我们的layout * 3. 下载前我们要做什么? UI * 4. 下载中我们要做什么? 数据 * 5. 下载后我们要做什么? UI */ public class MainActivity extends AppCompatActivity { public static final int INIT_PROGRESS = 0; public static final String APK_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk"; private ProgressBar mProgressBar; private Button mDownloadButton; private TextView mResultTextView; private String FILE_NAME; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化视图 initView(); //初始化UI数据 setData(); //设置点击监听 setListener(); DownloadHelper.download(APK_URL, "", new DownloadHelper.OnDownloadListener.SimpleDownloadListener() { @Override public void onSuccess(int code, File file) { } @Override public void onFail(int code, File file, String message) { } }); } /** * 初始化视图 */ private void initView() { mProgressBar = (ProgressBar) findViewById(R.id.progressBar); mDownloadButton = (Button) findViewById(R.id.button); mResultTextView = (TextView) findViewById(R.id.textView); } private void setListener() { mDownloadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // TODO: 2017/8/20 下载任务 DownloadAsyncTask asyncTask = new DownloadAsyncTask(); asyncTask.execute(APK_URL); } }); } private void setData() { mProgressBar.setProgress(INIT_PROGRESS); mDownloadButton.setText(R.string.click_download); mResultTextView.setText(R.string.download_text); } /** * String 入参 * Integer 进度 * Boolean 返回值 */ private class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> { private String mFilePath; /** * 在异步任务之前,在主线程中 */ @Override protected void onPreExecute() { super.onPreExecute(); //可操作UI 之前的准备工作 mDownloadButton.setText(R.string.downloading); mResultTextView.setText(R.string.downloading); mProgressBar.setProgress(INIT_PROGRESS); } /** * 在另外一个线程中处理事件 * * @param strings 入参 * @return 结果 */ @Override protected Boolean doInBackground(String... strings) { if (strings != null && strings.length > 0) { String apkUrl = strings[0]; try { //构造URL URL url = new URL(apkUrl); //构造链接,并打开 URLConnection urlConnection = url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); //获取了下载内容的总长度 int contentLength = urlConnection.getContentLength(); //下载地址准备,File.separator是斜线 FILE_NAME = "imooc.apk"; mFilePath = Environment.getExternalStorageDirectory() + File.separator + FILE_NAME; //对下载地址进行处理 File apkFile = new File(mFilePath); if (apkFile.exists()) { boolean result = apkFile.delete(); if (!result) { return false; } } //已下载的大小 int downloadSize = 0; //byte数组 byte[] bytes = new byte[1024]; int length; //创建一个输入管道 OutputStream outputStream = new FileOutputStream(mFilePath); //不断的从网络读取字节到byte数组再写入文件中 while ((length = inputStream.read(bytes)) != -1) { //读取的字节放到文件管道里 outputStream.write(bytes, 0, length); //累加下载进度 downloadSize += length; //发送进度 publishProgress(downloadSize * 100 / contentLength); } inputStream.close(); outputStream.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } return true; } @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); //在UI线程中,执行结果 处理 mDownloadButton.setText(aBoolean ? getString(R.string.download_finish) : getString(R.string.download_fail)); mResultTextView.setText(aBoolean ? getString(R.string.download_finish) + mFilePath : getString(R.string.download_fail)); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); //收到进度,然后处理: 在UI线程中 if (values != null && values.length > 0) { mProgressBar.setProgress(values[0]); } } } }
相关文章推荐
- 封装思想之:NSoperation的自定义实现
- jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
- 在U-Boot中添加自定义命令以实现自动下载程序【转】
- 自定义CancelEventArgs类,封装事件参数信息,实现e.Cancle=true取消机制。
- Asp.net 2.0 实现自定义Email格式有效性验证(示例代码下载)
- ActiveX下载(JavaScript实现,含setup.bat文件,创建自解压文件,ActiveX控件存在判断与自定义下载页面)
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!
- 大文件 and 多下载任务的封装(二)--观察者模式--实现下载进度的实时更新
- 用dl模拟实现可自定义样式的SELECT下拉列表(已封装)
- PHP实现的下载远程图片自定义函数分享
- 微信小程序实现自定义modal弹窗封装的方法
- 自定义实现简单的ios风格的弹窗加载进度框,一步步走向封装
- Swift - Alamofire与Cache封装实现网络缓存、下载
- asp.net中用FileStream类实现下载文件功能,自定义下载路径,像IE下载一样
- Android通知栏实现APP下载更新(DownloadManager和自定义Notification2种方式实现)
- 通过封装的AsyncTask类实现下载apk应用
- ios多线程操作(十二)—— 自定义NSOperation实现网络下载后回调
- QCGCD : 将GCD进行封装,实现轻松调用(git下载)
- 封装Ftp API函数,实现上传,下载文件,创建目录
- android自定义Dialog实现文件下载和下载进度