首页 > 系统 > Android > 正文

Android使用Handler实现下载文件功能

2019-10-22 18:09:58
字体:
来源:转载
供稿:网友

本文实例为大家分享了Android实现下载文件的具体代码,供大家参考,具体内容如下

1.实现效果

直接上图: 

Android,Handler,下载文件

2.代码实现

在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="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/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"  style="?android:attr/progressBarStyleHorizontal"  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 = "http://download.sj.qq.com/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:     activity.progressBar.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();   outputStream.close();  } catch (MalformedURLException e) {   //下载失败的话也发送消息   notifyDownloadFailed();   e.printStackTrace();  } catch (IOException e) {   notifyDownloadFailed();   e.printStackTrace();  } } /**  * 通知下载失败  */ private void notifyDownloadFailed() {  Message message = Message.obtain();  message.what = DOWNLOAD_MESSAGE_FAIL_CODE;  mHandler.sendMessage(message); } /**  * 初始化视图  */ private void initView() {  button = findViewById(R.id.button);  progressBar = findViewById(R.id.progressBar); }}

3.快捷键总结

提取方法:Ctrl+Alt+M; 
提取变量:Ctrl+Alt+V; 
提取常量:Ctrl+Alt+C;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表