




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中利用Handler实现一个文件下载功能
这篇文章给大家介绍怎么在Android中利用Handler实现一个文件下载功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。代码实现在AndroidManifest.xml文件中声明申请的权限,如下所示:<uses-permission
android:name="android.permission.INTERNET"
/>
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>新建一个名为DownloadDemo的项目,activity_main.xml代码如下:<?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:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="下载"
/>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:max="100"
android:progress="0"
/>
</LinearLayout>MainActivity.class代码如下:public
class
MainActivity
extends
AppCompatActivity
implements
View.OnClickListener
{
public
static
final
String
APP_URL
=
"/upload/connAssitantDownload/upload/MobileAssistant_1.apk";
public
static
final
int
DOWNLOAD_MESSAGE_CODE
=
100001;
private
static
final
int
DOWNLOAD_MESSAGE_FAIL_CODE
=
100002;
public
static
final
int
REQUEST_CODE
=
1;
private
Button
button;
private
ProgressBar
progressBar;
private
MyHandler
mHandler;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
askPermission();
mHandler
=
new
MyHandler(this);
}
public
static
class
MyHandler
extends
Handler
{
final
WeakReference<MainActivity>
mWeakReference;
public
MyHandler(MainActivity
activity)
{
this.mWeakReference
=
new
WeakReference<>(activity);
}
@Override
public
void
handleMessage(Message
msg)
{
MainActivity
activity
=
mWeakReference.get();
super.handleMessage(msg);
switch
(msg.what)
{
case
DOWNLOAD_MESSAGE_CODE:
gressBar.setProgress((Integer)
msg.obj);
if
(((Integer)
msg.obj)
==
100)
{
Toast.makeText(activity,
"文件下载已完成!",
Toast.LENGTH_SHORT).show();
}
break;
case
DOWNLOAD_MESSAGE_FAIL_CODE:
Toast.makeText(activity,
"文件下载失败!",
Toast.LENGTH_SHORT).show();
break;
}
}
}
/**
*
申请权限
*/
private
void
askPermission()
{
//将所需申请的权限添加到List集合中
List<String>
permissionList
=
new
ArrayList<>();
if
(ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!=
PackageManager.PERMISSION_GRANTED)
{
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
//判断权限列表是否为空,若不为空,则向用户申请权限,否则则直接执行操作
if
(!permissionList.isEmpty())
{
String[]
permissions
=
permissionList.toArray(new
String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this,
permissions,
REQUEST_CODE);
}
else
{
//TODO
button.setOnClickListener(this);
}
}
/**
*
用户对请求权限的dialog做出响应之后,会处理请求权限的响应
*
*
@param
requestCode
请求码
*
@param
permissions
权限的集合
*
@param
grantResults
权限授予的结果
*/
@Override
public
void
onRequestPermissionsResult(int
requestCode,
@NonNull
String[]
permissions,
@NonNull
int[]
grantResults)
{
super.onRequestPermissionsResult(requestCode,
permissions,
grantResults);
switch
(requestCode)
{
case
REQUEST_CODE:
if
(grantResults.length
>
0)
{
for
(int
result
:
grantResults)
{
if
(result
!=
PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(this,
"必须同意所有权限才能使用本程序",
Toast.LENGTH_SHORT).show();
finish();
return;
}
}
//TODO
button.setOnClickListener(this);
}
else
{
Toast.makeText(this,
"权限申请失败!",
Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
break;
}
}
/**
*
点击事件
*
*
@param
v
*/
@Override
public
void
onClick(View
v)
{
switch
(v.getId())
{
case
R.id.button:
new
Thread(new
Runnable()
{
@Override
public
void
run()
{
download(APP_URL);
}
}).start();
break;
}
}
/**
*
下载
*
*
@param
appUrl
*/
private
void
download(String
appUrl)
{
try
{
//实例化一个url对象
URL
url
=
new
URL(appUrl);
//获取URLConnection对象
URLConnection
urlConnection
=
url.openConnection();
//获取输入流
InputStream
inputStream
=
urlConnection.getInputStream();
//获取文件的总长度
int
contentLength
=
urlConnection.getContentLength();
//设置软件下载到手机存储的位置文件夹名称
String
downloadFolderName
=
Environment.getExternalStorageDirectory()
+
File.separator
+
"MyApp"
+
File.separator;
File
file
=
new
File(downloadFolderName);
//若文件夹不存在则进行创建
if
(!file.exists())
{
file.mkdir();
}
String
fileName
=
downloadFolderName
+
"chaixingsi.apk";
File
apkFile
=
new
File(fileName);
if
(apkFile.exists())
{
apkFile.delete();
}
int
downloadContentLength
=
0;
int
length
=
0;
byte[]
bytes
=
new
byte[1024];
OutputStream
outputStream
=
new
FileOutputStream(fileName);
while
((length
=
inputStream.read(bytes))
!=
-1)
{
outputStream.write(bytes,
0,
length);
downloadContentLength
+=
length;
/**
*
发送消息通知主线程去更新UI
*/
Message
message
=
Message.obtain();
message.obj
=
downloadContentLength
*
100
/
contentLength;
message.what
=
DOWNLOAD_MESSAGE_CODE;
mHandler.sendMessage(message);
}
inputStream.close();
output
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业科技园区综合开发项目合同
- 独家代理销售合作协议
- 数字信号处理算法及应用试题库
- 食物中能量的释放课件-2024-2025学年北师大版生物七年级下册
- 医疗器械技术创新合同
- 公司并购财务顾问协议
- 税务筹划咨询服务协议
- 招标采购协议管理
- 消防设备购销合同
- 专业音频制作服务平台协议
- 水利安全生产风险防控“六项机制”右江模式经验分享
- 急诊科进修三个月总结
- MOOC 知识创新与学术规范-南京大学 中国大学慕课答案
- 2024年黄河水利职业技术学院单招职业技能测试题库及答案解析
- 聚焦国内外时政重要新闻热点新闻播报课件
- 法国大革命完整版
- 脓毒血症指南(医生版)课件
- 经典美味的蛋炒饭
- 管理学基础(第3版)全套教学课件
- 综合性学习答题技巧课件
- 交互设计装置设计
评论
0/150
提交评论