版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android中怎么利用AsyncTask实现下载文件动态更新进度条功能
Android中怎么利用AsyncTask实现下载文件动态更新进度条功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.泛型AysncTask<Params,Progress,Result>Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入。Progress:后台任务执行的进度,若不用显示进度条,则不需要指定。Result:后台任务结束时返回的结果。2.重要方法doInBackground(Params...params):必须重写的方法,后台任务就在这里执行,会开启一个新的线程。params为启动任务时传入的参数,参数个数不定。onPreExecute():在主线程中调用,在后台任务开启前的操作在这里进行,例如显示一个进度条对话框。onPostExecute(Resultresult):当后台任务结束后,在主线程中调用,处理doInBackground()方法返回的结果。onProgressUpdate(Progress...values):当在doInBackground()中调用publishProgress(Progress...values)时,返回主线程中调用,这里的参数个数也是不定的。onCancelled():取消任务。3.注意事项(1)execute()方法必须在主线程中调用;(2)AsyncTask实例必须在主线程中创建;(3)不要手动调用doInBackground()、onPreExecute()、onPostExecute()、onProgressUpdate()方法;(4)注意防止内存泄漏,在doInBackground()方法中若出现对Activity的强引用,可能会造成内存泄漏。4.下载文件动态更新进度条(未封装)布局:<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="20dp"
tools:context="com.studying.asynctaskdemo.MainActivity">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="0"
/>
<Button
android:id="@+id/download"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:text="@string/start_btn"
/>
<TextView
android:id="@+id/status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/waiting"
/>
</LinearLayout>Activity:public
class
MainActivity
extends
Activity
{
private
static
final
String
FILE_NAME
=
"test.pdf";//下载文件的名称
private
static
final
String
PDF_URL
=
"/class/assist/118/1328281/AsyncTask.pdf";
private
ProgressBar
mProgressBar;
private
Button
mDownloadBtn;
private
TextView
mStatus;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private
void
initView()
{
mProgressBar
=
(ProgressBar)
findViewById(R.gressBar);
mDownloadBtn
=
(Button)
findViewById(R.id.download);
mStatus
=
(TextView)
findViewById(R.id.status);
}
private
void
setListener()
{
mDownloadBtn.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
//AsyncTask实例必须在主线程创建
DownloadAsyncTask
asyncTask
=
new
DownloadAsyncTask();
asyncTask.execute(PDF_URL);
}
});
}
/**
*
泛型:
*
String:传入参数为文件下载地址
*
Integer:下载过程中更新ProgressBar的进度
*
Boolean:是否下载成功
*/
private
class
DownloadAsyncTask
extends
AsyncTask<String,
Integer,
Boolean>
{
private
String
mFilePath;//下载文件的保存路径
@Override
protected
Boolean
doInBackground(String...
params)
{
if
(params
!=
null
&&
params.length
>
0)
{
String
pdfUrl
=
params[0];
try
{
URL
url
=
new
URL(pdfUrl);
URLConnection
urlConnection
=
url.openConnection();
InputStream
in
=
urlConnection.getInputStream();
int
contentLength
=
urlConnection.getContentLength();//获取内容总长度
mFilePath
=
Environment.getExternalStorageDirectory()
+
File.separator
+
FILE_NAME;
//若存在同名文件则删除
File
pdfFile
=
new
File(mFilePath);
if
(pdfFile.exists())
{
boolean
result
=
pdfFile.delete();
if
(!result)
{
return
false;
}
}
int
downloadSize
=
0;//已经下载的大小
byte[]
bytes
=
new
byte[1024];
int
length
=
0;
OutputStream
out
=
new
FileOutputStream(mFilePath);
while
((length
=
in.read(bytes))
!=
-1)
{
out.write(bytes,
0,
length);
downloadSize
+=
length;
publishProgress(downloadSize
/
contentLength
*
100);
}
in.close();
out.close();
}
catch
(IOException
e)
{
e.printStackTrace();
return
false;
}
}
else
{
return
false;
}
return
true;
}
@Override
protected
void
onPreExecute()
{
super.onPreExecute();
mDownloadBtn.setText("下载中");
mDownloadBtn.setEnabled(false);
mStatus.setText("下载中");
mProgressBar.setProgress(0);
}
@Override
protected
void
onPostExecute(Boolean
aBoolean)
{
super.onPostExecute(aBoolean);
mDownloadBtn.setText("下载完成");
mStatus.setText(aBoolean
?
"下载完成"
+
mFilePath
:
"下载失败");
}
@Override
protected
void
onProgressUpdate(Integer...
values)
{
super.onProgressUpdate(values);
if
(values
!=
null
&&
values.length
>
0)
{
mProgressBar.setProgress(values[0]);
}
}
}
}5.下载文件动态更新进度条(封装)Activity:public
class
MainActivity
extends
Activity
{
private
static
final
String
FILE_NAME
=
"test.pdf";
private
static
final
String
PDF_URL
=
"/class/assist/118/1328281/AsyncTask.pdf";
private
ProgressBar
mProgressBar;
private
Button
mDownloadBtn;
private
TextView
mStatus;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private
void
initView()
{
mProgressBar
=
(ProgressBar)
findViewById(R.gressBar);
mDownloadBtn
=
(Button)
findViewById(R.id.download);
mStatus
=
(TextView)
findViewById(R.id.status);
}
private
void
setListener()
{
mDownloadBtn.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
String
localPath
=
Environment.getExternalStorageDirectory()
+
File.separator
+
FILE_NAME;
DownloadHelper.download(PDF_URL,
localPath,
new
DownloadHelper.OnDownloadListener()
{
@Override
public
void
onStart()
{
mDownloadBtn.setText("下载中");
mDownloadBtn.setEnabled(false);
mStatus.setText("下载中");
mProgressBar.setProgress(0);
}
@Override
public
void
onSuccess(File
file)
{
mDownloadBtn.setText("下载完成");
mStatus.setText(String.format("下载完成:%s",
file.getPath()));
}
@Override
public
void
onFail(File
file,
String
failInfo)
{
mDownloadBtn.setText("开始下载");
mDownloadBtn.setEnabled(true);
mStatus.setText(String.format("下载失败:%s",
failInfo));
}
@Override
public
void
onProgress(int
progress)
{
mProgressBar.setProgress(progress);
}
});
}
});
}
}DownloadHelper: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>
{
private
String
mFailInfo;
private
String
mUrl;
private
String
mFilePath;
private
OnDownloadListener
mListener;
DownloadAsyncTask(String
mUrl,
String
mFilePath,
OnDownloadListener
mListener)
{
this.mUrl
=
mUrl;
this.mFilePath
=
mFilePath;
this.mListener
=
mListener;
}
@Override
protected
Boolean
doInBackground(String...
params)
{
String
pdfUrl
=
mUrl;
try
{
URL
url
=
new
URL(pdfUrl);
URLConnection
urlConnection
=
url.openConnection();
InputStream
in
=
urlConnection.getInputStream();
int
contentLength
=
urlConnection.getContentLength();
File
pdfFile
=
new
File(mFilePath);
if
(pdfFile.exists())
{
boolean
result
=
pdfFile.delete();
if
(!result)
{
mFailInfo
=
"存储路径下的同名文件删除失败!";
return
false;
}
}
int
downloadSize
=
0;
byte[]
bytes
=
new
byte[1024];
int
length;
OutputStream
out
=
new
FileOutputStream(mFilePath);
while
((length
=
in.read(bytes))
!=
-1)
{
out.write(bytes,
0,
length);
downloadSize
+=
length;
publishProgress(downloadSize
/
contentLength
*
100);
}
in.close();
out.close();
}
catch
(IOException
e)
{
e.printStackTrace();
mFailInfo
=
e.getMessage();
r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四级劳动关系协调员试题
- DB1501-T 0045-2024 古树名木资源调查技术规程
- 农副产品加工业使用危险化学品主要技术防范措施
- 2024年新人教版七年级上册语文教学课件 第5单元17《猫》课时2
- 亳州市利辛县2025届四年级数学第一学期期末统考试题含解析
- 沧州市新华区2025届数学四年级第一学期期末监测试题含解析
- 北京西城实小2024年数学六上期末联考试题含解析
- 超薄板带钢项目冷轧某综合楼土建工程施工组织设计
- 专升本入学考试《文学概论》专项测试题及答案
- 保人身手册(农电修订)复习测试附答案
- 汉语言文学专的业毕业论文流行歌曲歌词赏析
- JX820D型便携式吸引器使用说明书
- 强夯检测方案总结
- 小学六年级主题班队教案 全册
- 本科教学工作审核评估汇报PPT课件
- 化工设备常识
- 回压对油井产量及耗电量的影响分析
- 《串联和并联》学情分析方案
- 试论小学数学教学中培养学生想象力的策略
- 安全监测监控工培训实施方案
- 运动治疗_体位转移训练
评论
0/150
提交评论