一些说明

ProgressBar.setProgress():

刷新UI操作必须运行在UI线程中,但是setProgress()方法里面已经做了同步操作,所以可以在非UI线程中调用

webView.loadUrl():

耗时操作不能运行在UI线程中,但是loadUrl()方法进过特殊处理,所以可以在UI线程中调用

异步任务demo

> AsyncTask下载网络文件,并显示下载进度

test_AsyncTask.java

package com.example.testasynctask;import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;public class test_AsyncTask extends Activity {private ProgressBar pb_down;private TextView tv_downProgress;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.test_async_task);Button btn_down = (Button) findViewById(R.id.btn_down);btn_down.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String downloadUrl = "http://501xm.cache.cheerpic.com/source/chizi/201508/32283-20150804.apk";String saveDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/test/download";Log.d("pointwall", saveDir);DownTask downTask = new DownTask();downTask.execute(downloadUrl, saveDir);}});}class DownTask extends AsyncTask<String, // Params,启动任务时传入的参数类型Integer, // Progress,后台任务执行中返回值的类型String// Result,后台任务执行完成返回结果的类型> {/*** 执行后台耗时操作前被调用,通常完成一些初始化操作,运行在主线程*/@Overrideprotected void onPreExecute() {tv_downProgress = (TextView) findViewById(R.id.tv_downProgress);pb_down = (ProgressBar) findViewById(R.id.pb_down);pb_down.setMax(100);}/*** 必须重写,异步执行后台将要完成的任务,运行在子线程*/@Overrideprotected String doInBackground(String... params) {String downloadUrl = params[0];String saveDir = params[1];try {int currentProgress = 0;// 当前已下载文件长度URL url = new URL(downloadUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(8000);conn.setReadTimeout(8000);if (conn.getResponseCode() == 200) {int length = conn.getContentLength();InputStream is = conn.getInputStream();byte[] b = new byte[1024];int len;File file2 = new File(saveDir);if (!file2.exists()) {file2.mkdirs();}File file = new File(saveDir, getFileName(downloadUrl));RandomAccessFile raf = new RandomAccessFile(file, "rwd");while ((len = is.read(b)) != -1) {raf.write(b, 0, len);currentProgress += len;// TODO 下载len个长度的字节int downRate = (int) ((long) currentProgress * 100 / length);publishProgress(downRate);}raf.close();}} catch (Exception e) {e.printStackTrace();}return saveDir + getFileName(downloadUrl);}/*** 在doInBackgroung()方法中调用publishProgress()方法 更新任务的执行进度后,就会触发该方法,运行在主线程*/@Overrideprotected void onProgressUpdate(Integer... values) {int downRate = values[0];Log.d("ziru", downRate + "");pb_down.setProgress(downRate);tv_downProgress.setText("下载了:" + downRate + "%");}/*** 当doInBackground()完成后,系统会自动调用,运行在主线程*/@Overrideprotected void onPostExecute(String result) {tv_downProgress.setText("下载完成");}/*** 根据下载地址获取app名字* @param downloadDir 下载地址* @return app名字,如:32283-20150804.apk*/private String getFileName(String downloadDir) {int index = downloadDir.lastIndexOf("/");return downloadDir.substring(index + 1);}}}

test_asynctask.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"android:orientation="vertical"android:padding="5dp" ><ProgressBarandroid:id="@+id/pb_down"style="@android:style/Widget.ProgressBar.Horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp" /><TextViewandroid:id="@+id/tv_downProgress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="等待下载"android:textSize="20sp" /><Buttonandroid:id="@+id/btn_down"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="下载" /></LinearLayout>

权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

AsyncTask注意事项

  • 必须在UI线程中创建AsyncTask实例
  • 必须在UI线程中调用AsyncTask.execute()方法
  • 重写的四个方法onPreExecute(), doInBackground(), onProgressUpdate(), onPostExecute()是系统调用的,不应手动调用
  • 每个AsyncTask只能被执行一次,多次调用会引发异常
  • 只有doInBackground()运行在其他线程,onPreExecute(), onProgressUpdate(), onPostExecute()三个方法都运行在UI线程

如何取消AsyncTask

1. 在Activity的onPause()方法中將AsyncTask标记为cancel状态

@Override
protected void onPause(){super.onPause();if(mAsyncTask != null &&mAsyncTask.getStatus() == AsyncTask.Status.RUNNING){// cancel方法只是將对应的AsyncTask标记为cancel状态,并不是真正的取消线程的执行mAsyncTask.cancel(true);}
}

2. 在doInBackground()和onProgressUpdate()方法里做取消异步任务处理

@Override
protected String doInBackground(String... params) {if(isCancelled()){break;}return null;
}@Override
protected void onProgressUpdate(Integer... values) {if(isCancelled()){break;}
}

AsyncTask下载网络文件,并显示下载进度相关推荐

  1. python实现http下载文件-Python HTTP下载文件并显示下载进度条功能的实现

    下面的Python脚本中利用request下载文件并写入到文件系统,利用progressbar模块显示下载进度条. 其中利用request模块下载文件可以直接下载,不需要使用open方法,例如: im ...

  2. Linux命令06 - - wget 下载网络文件

    wget命令支持如HTTP.HTTPS.FTP等常见协议,可以在命令行中直接下载网络文件. web get缩写 wget 官网:http://www.gnu.org/software/wget/ wg ...

  3. (Delphi)如和下载网络文件的例子

    FTP下载: http://www.7880.com/Info/Article-19938be0.html          http://community.csdn.net/Expert/topi ...

  4. [工具库]JFileDownloader工具类——多线程下载网络文件,并保存在本地

    本人大四即将毕业的准程序员(JavaSE.JavaEE.android等)一枚,小项目也做过一点,于是乎一时兴起就写了一些工具. 我会在本博客中陆续发布一些平时可能会用到的工具. 代码质量可能不是很好 ...

  5. wget命令——下载网络文件

    wget命令是英文词组"web get"的缩写,用于从指定网址下载网络文件. wget命令支持如HTTP.HTTPS.FTP等常见协议,可以在命令行中直接下载网络文件. 与curl ...

  6. java下载网络中的文件,java下载网络文件解决思路

    java下载网络文件 下面这段代码是下载一个http网络文件的代码,但有时候下载下来的图片是完整的,有时候下载下来的不完整,还有下载的ppt,pdf之类,也是打不开的.请大件们给指导一下,小弟感激不尽 ...

  7. R语言使用download.file函数下载网络文件到本地(Download File from the Internet)

    R语言使用download.file函数下载网络文件到本地(Download File from the Internet) 目录 R语言使用download.file函数下载网络文件到本地(Down ...

  8. python urlretrieve_使用urllib库的urlretrieve()方法下载网络文件到本地的方法

    概述 见源码 源码 # !/usr/bin/env python # -*- coding:utf-8 -*- """ 图片(文件)下载,核心方法是 urllib.url ...

  9. java下载网络文件_java下载网络文件的方法有哪些

    下载网络文件的方法有:字节流下载 apache的FileUtils工具包下载 NIO下载 实现代码如下:package com.dsp.rpc.metricelf; import org.apache ...

最新文章

  1. 新技能 MyBatis 千万数据表,快速分页!
  2. java与SPARK的使用的一个类似文章
  3. 《SAP ABAP 开发入门》课程正式发布
  4. 用Python实现一个1加到n求和功能的函数
  5. unity 删除子节点_【Unity文档】Realtime GI介绍(一)
  6. 【NOI2013模拟】棋盘游戏
  7. python中set函数是什么数据类型_阿博Python之路-详解Set数据类型
  8. mie散射粒子消光系数 matlab代码,一种球形粒子GMie散射效率极值的算法
  9. InnoDB master thread工作原理
  10. QTP鼠标点击和浏览器事件的动态切换
  11. 关于java构造方法的描述_在JAVA语言中,下面关于构造函数描述正确的是()
  12. 【OpenCV教程】第一章 Mac上的安装和初步使用
  13. 解读主流CDN厂商的节点数据
  14. 计算方法(一):误差
  15. 【初等概率论】 01
  16. 用Java Swing山寨QQ空间的魔法卡片游戏
  17. 基于MVC模式的企业公文处理信息系统的设计与实现
  18. SPSS25 bootstrap结果输出不显示
  19. MacOS Catalina 10.15安装教程,启动U盘制作及安装方法
  20. 服务器 台式机性能比较,服务器与台式机的区别

热门文章

  1. Vivado使用技巧(17):创建IBIS模型
  2. 强人工智能基本问题:自上而下还是自下而上? 1
  3. 【Redis技术探索】「底层架构原理」帮你从底层彻底吃透AOF技术原理(入门第二步)
  4. 【论文解读 WSDM 2018 | SHINE】Signed HIN Embedding for Sentiment Link Prediction
  5. 使用HTML实现网页滚动图片
  6. javaweb学生竞赛管理系统
  7. vr企业视频展示如何制作
  8. 菜鸟初识脚本 and 脚本语言
  9. 电脑tcp协议设置成服务器,电脑tcp协议设置成服务器
  10. 互联网舆情监测公司监测哪些内容,TOOM北京舆情监测公司