老师,我这边下载失败怎么后台没有提示呢?
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
- 参与学习 人
- 提交作业 307 份
- 解答问题 1613 个
本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星