首页 > 代码库 > 赵雅智_android多线程下载带进度条
赵雅智_android多线程下载带进度条
progressBar说明
在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度。一个进度条也可不确定其进度。在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。
XML重要属性
android:progressBarStyle:默认进度条样式
android:progressBarStyleHorizontal:水平样式
progressBar重要方法
getMax():返回这个进度条的范围的上限
getProgress():返回进度
getSecondaryProgress():返回次要进度
incrementProgressBy(int diff):指定增加的进度
isIndeterminate():指示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate):设置不确定模式下
setVisibility(int v):设置该进度条是否可视
progressBar重要事件
onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件
项目实现步骤分析
1.给进度调设置最大值
2.无论哪一个线程下载都要记录进度条当前位置,并设置值
3.给textview设置显示当前下载值
4.创建临时文件把以前下载好的位置记录起来
5.当线程下载完后删除临时保存进度条位置的文件
主要代码:
添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
布局文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android_download" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.android_download.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
StreamTools工具
android线程下载的工具一样http://blog.csdn.net/zhaoyazhi2129/article/details/27189465
Activity主要代码
package com.example.android_download; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.example.util.StreamTools; public class MainActivity extends Activity { private int threadNum = 3;// 线程开启的数量 private int threadRunning = 3;// 正在运行的线程 private TextView tv_pb; private EditText et_url; private ProgressBar pb_download; private int currentPb;//当前值 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); File sdDir = Environment.getExternalStorageDirectory(); File pdFile = new File(sdDir, "pb.txt"); InputStream is = null; try { // 判断文件是否存在 if (pdFile.exists()) { is = new FileInputStream(pdFile); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (is != null) { String value = http://www.mamicode.com/StreamTools.streamToStr(is);>补充知识点
不用在给进度条设置值的时候考虑同步,因为android定义progressBar的时候已经 设置了同步
2.当程序有多个线程访问一个变量,可以用synchronized解决
synchronized (MainActivity.this) { //进度条当前进度 currentPb += len; pb_download.setProgress(currentPb); runOnUiThread(new Runnable() { @Override public void run() { tv_pb.setText("当前的进度是:"+currentPb*100/pb_download.getMax()+"%"); } });运行结果
1.当文件下载时,进度条显示和当前进度显示
2.当重新加载时继续上次下载
3.当文件进行下载时,临时存储下载文件位置的pb.txt被创建
4.当线程下载完毕后,在主线程Toast下载完毕
5.当下在完成后进度条走满,当前进度为100%
6.下载完后,临时文件销毁
源代码下载地址:http://download.csdn.net/detail/zhaoyazhi2129/7406731
转发请标明出处:http://blog.csdn.net/zhaoyazhi2129/article/details/27192169