老师,我这边下载失败怎么后台没有提示呢?

老师,我这边下载失败怎么后台没有提示呢?

package com.example.myapplication;

import android.os.AsyncTask;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
1.网络上请求数据:申请网络权限 读写存储权限
2.布局我们的layout
3.下载之前我们要做什么? UI
4.下载中我们要做什么?  数据
5.下载之后我们要做什么? UI
*/
public class MainActivity extends AppCompatActivity {
   private static final String TAG = "MainActivity";
   public static final int INIT_PROGRESS = 0;
   public static final String APK_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk";
   private ProgressBar mProgressBar;
   private Button mButton;
   private TextView mTextView;


   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       //1.初始化视图
       initView();
       //2.设置监听事件
       setListener();
       //3.初始化UI数据
       setData();
   }

   /**
    * 初始化视图
    */
   private void initView() {
       mProgressBar = findViewById(R.id.progressBar);
       mButton = findViewById(R.id.butt


   private void setData() {
       mProgressBar.setProgress(INIT_PROGRESS);
       mButton.setText(R.string.click_download);
       mTextView.setText(R.string.download_text);
   }
   /**
    * 在名为后台线程中处理AsyncTask事务
    String 入参--doInBackground(String... strings)
    Integer 进度条--onProgressUpdate(Integer... values)
    Boolean 返回值(出参)--onPostExecute(Boolean aBoolean)
    */
   public class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{
       String fileName;
       @Override
       protected void onPreExecute() {
           /**
            * 在异步任务之前,在主线程中,可操作UI(类似于淘米)
            */
           super.onPreExecute();
           mButton.setText(R.string.downloading);
           mTextView.setText(R.string.downloading);
           mProgressBar.setProgress(INIT_PROGRESS);
       }


       @Override//(String... strings)为可变参数[可以是一个参数,也可以是多个参数]
       protected Boolean doInBackground(String... strings) {
           /**
            * 短路连接符&&
            * 例如strings!=null&&strings.length>0
            * 如果strings!=null不满足,则直接返回false,不去判断strings.length>0
            * 如果strings!=null满足,再去判断strings.length>0是否满足
            * 递进判断,全为真则为true
            */
           if(strings!=null&&strings.length>0){
               String apkUrl = strings[0];
               try {
                   //构造Url
                   URL url = new URL(apkUrl);
                   //构造连接
                   URLConnection urlConnection = url.openConnection();
                   //读取该连接的输入流
                   InputStream inputStream = urlConnection.getInputStream();
                   //获取该文件的长度,用于进度更新
                   int contentLength = urlConnection.getContentLength();
                   //定义下载文件以及路径
                   String downloadFolderName = getExternalFilesDir(null).
                           getAbsolutePath()+ File.separator+"asyncTask"+File.separator;
                   //软件位于的文件夹路径及名称
                   File file = new File(downloadFolderName);
                   if(!file.exists()){
                       file.mkdir();
                   }
                   //软件的路径名称
                   fileName = downloadFolderName + "asyncTask.apk";
                   File apkFile = new File(fileName);
                   if(apkFile.exists()){
                       apkFile.delete();
                   }else{
                       return false;
                   }


                   //正式开始下载
                   int downloadSize = 0;//已下载的进度
                   byte[] bytes = new byte[1024];//用于缓存的bytes数组
                   OutputStream outputStream = new FileOutputStream(fileName);//创建输出管道,输出到fileName这个文件夹中
                   int length;
                   //不断一车一车挖土,直到挖完为止
                   while ((length = inputStream.read(bytes))!=-1){
                       outputStream.write(bytes,0,length);
                       downloadSize+=length;
                       publishProgress(downloadSize*100/contentLength);//转化为百分比(抛出进度)
                   }
                   inputStream.close();
                   outputStream.close();
               } catch (IOException e) {
                   e.printStackTrace();
                   return false;
               }
           }
           return true;
       }

       @Override
       protected void onPostExecute(Boolean aBoolean) {
           super.onPostExecute(aBoolean);
           //也是在主线程中,执行结果处理
           mButton.setText(aBoolean?getString(R.string.download_finish):getString(R.string.download_fail));
           mTextView.setText(aBoolean?getString(R.string.download_finish)+fileName:getString(R.string.download_fail));
       }
       //处理进度的方法
       @Override
       protected void onProgressUpdate(Integer... values) {
           super.onProgressUpdate(values);
           //收到进度,然后处理,也是在主线程中进行
           if(values!=null&&values.length>0){
               mProgressBar.setProgress(values[0]);
           }
       }
     
   }
}

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕雪 2017-11-27 16:30:37

1)跟踪doInBackground中()下载失败后看一下返回的是真还是假。if(strings!=null&&strings.length>0){}else呢怎么办?也需要做一下处理。2)你在onPostExecute()中看一下aBoolean是真还是假?祝:学习愉快

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Android网络操作与数据存储2018版
  • 参与学习           人
  • 提交作业       307    份
  • 解答问题       1613    个

本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师