使用AsyncTask实现异步下载
2017-08-29 22:16
369 查看
MainActivity.java
strings.xml
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(); } /** * 初始化视图 */ 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 (s afe7 trings != 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]); } } } }
strings.xml
<resources> <string name="app_name">AsyncTaskProject</string> <string name="click_download">点击下载</string> <string name="download_text">准备下载</string> <string name="downloading">下载中</string> <string name="download_finish">下载完成</string> <string name="download_fail">下载失败</string> </resources>
相关文章推荐
- Android多线程分析之五:使用AsyncTask异步下载图像
- 使用NSOperation实现异步下载
- Android中使用AsyncTask实现异步加载
- 如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
- 使用异步任务-AsyncTask下载远程图片
- Android多线程分析之五:使用AsyncTask异步下载图像
- 使用NSOperation实现异步下载
- Android中使用AsyncTask实现文件下载以及进度更新提示
- AsyncTask 异步任务基本使用--下载视频
- 异步处理任务工具类(AsyncTask)实现多张图片的下载(已知url)
- Android实现异步任务机制AsyncTask 的使用及源码分析
- 使用ajaxFileUpload与SpringMVC实现异步上传下载文件并返回json数据
- 使用NSOperation实现异步下载
- AsyncTask(1)一个使用AsyncTask实现简单异步刷新的功能。
- Android使用缓存机制实现文件下载及异步请求图片加三级缓存
- Android中使用AsyncTask实现文件下载以及进度更新提示
- android学习笔记---使用AsyncTask实现异步处理,内部使用线程加Handler
- Android中使用AsyncTask实现文件下载以及进度更新提示
- Android 异步任务——AsyncTask (附使用AsyncTask下载图片Demo)
- 如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)