xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <ProgressBar
android:id="@+id/pb_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" /> <TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <Button
android:id="@+id/btn_start_download"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="下载" /> </LinearLayout>

java:

 import com.yolanda.nohttp.Headers;
import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.download.DownloadListener;
import com.yolanda.nohttp.download.DownloadRequest;
import com.yolanda.nohttp.error.ArgumentError;
import com.yolanda.nohttp.error.ClientError;
import com.yolanda.nohttp.error.NetworkError;
import com.yolanda.nohttp.error.ServerError;
import com.yolanda.nohttp.error.StorageReadWriteError;
import com.yolanda.nohttp.error.StorageSpaceNotEnoughError;
import com.yolanda.nohttp.error.TimeoutError;
import com.yolanda.nohttp.error.URLError;
import com.yolanda.nohttp.error.UnKnownHostError;
import com.yolanda.nohttp5.R;
import com.yolanda.nohttp5.config.AppConfig;
import com.yolanda.nohttp5.nohttp.CallServer;
import com.yolanda.nohttp5.util.Toast; import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView; public class DownloadActivity extends Activity implements View.OnClickListener, DownloadListener { private final static String PROGRESS_KEY = "download_progress";
/**
* 下载按钮、暂停、开始等.
*/
private TextView mBtnStart;
/**
* 下载状态.
*/
private TextView mTvResult;
/**
* 下载进度条.
*/
private ProgressBar mProgressBar;
/***
* 下载地址.
*/
private String url = "http://m.apk.67mo.com/apk/999129_21769077_1443483983292.apk";
/**
* 下载请求.
*/
private DownloadRequest downloadRequest; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download); mProgressBar = (ProgressBar) findViewById(R.id.pb_progress);
mBtnStart = (TextView) findViewById(R.id.btn_start_download);
mTvResult = (TextView) findViewById(R.id.tv_result);
mBtnStart.setOnClickListener(this); // url 下载地址
// fileFolder 保存的文件夹
// fileName 文件名
// isRange 是否断点续传下载
// isDeleteOld 如果发现文件已经存在是否删除后重新下载
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
downloadRequest = NoHttp.createDownloadRequest(url, path, "nohttp.apk", true, false); // 检查已经下载了一半的文件是什么状态
int status = downloadRequest.checkBeforeStatus();
if (status == DownloadRequest.STATUS_FINISH) {// 文件已经下载完成
mTvResult.setText("下载完成");
mBtnStart.setText("已经下载完成");
// ... 提示用户安装apk
} else if (status == DownloadRequest.STATUS_RESTART) {// 代表文件不存在,需要从头下载
mTvResult.setText("");
mBtnStart.setText("下载");
} else if (status == DownloadRequest.STATUS_RESUME) {// 代表文件已经下载了一半了
int progress = AppConfig.getInstance().getInt(PROGRESS_KEY, );
mProgressBar.setProgress(progress);
mTvResult.setText("已经下载了 " + progress + "%");
mBtnStart.setText("继续下载");
}
} @Override
public void onClick(View v) {
if (downloadRequest.isStarted()) {
// 暂停下载
downloadRequest.cancel(true);
} else {
// what 区分下载
// downloadRequest 下载请求对象
// downloadListener 下载监听
CallServer.getDownloadInstance().add(, downloadRequest, this);
}
} /**
* @param what 代表哪一个下载
* @param isResume 是不是断点续续传开始下载的
* @param beforeLenght 断点开始的地方的文件大小
* @param headers 本地请求的时候的响应头
* @param allCount 本次需要下载多少
*/
@Override
public void onStart(int what, boolean isResume, long beforeLenght, Headers headers, long allCount) {
int progress = AppConfig.getInstance().getInt(PROGRESS_KEY, );
mTvResult.setText("已下载: " + progress + "%");
mBtnStart.setText("暂停");
} @Override
public void onProgress(int what, int progress, long fileCount) {
AppConfig.getInstance().putInt(PROGRESS_KEY, progress);
mProgressBar.setProgress(progress);
mTvResult.setText("已经下载了 " + progress + "%");
} @Override
public void onDownloadError(int what, Exception exception) {
mBtnStart.setText("再次尝试"); String message = "下载出错了:";
if (exception instanceof ClientError) {
message += "客户端错误";
} else if (exception instanceof ServerError) {
message += "服务器发生内部错误";
} else if (exception instanceof NetworkError) {
message += "网络不可用,请检查网络";
} else if (exception instanceof StorageReadWriteError) {
message += "存储卡错误,请检查存储卡";
} else if (exception instanceof StorageSpaceNotEnoughError) {
message += "存储位置空间不足";
} else if (exception instanceof TimeoutError) {
message += "下载超时";
} else if (exception instanceof UnKnownHostError) {
message += "服务器找不到";
} else if (exception instanceof URLError) {
message += "url地址错误";
} else if (exception instanceof ArgumentError) {
message += "下载参数错误";
} else {
message += "未知错误";
}
mTvResult.setText(message);
} @Override
public void onFinish(int what, String filePath) {
Toast.show("下载完成");
mTvResult.setText("下载完成,文件保存在:" + filePath);
} @Override
public void onCancel(int what) {
mTvResult.setText("下载暂停");
mBtnStart.setText("继续下载");
} }

NoHttp封装--05 文件下载的更多相关文章

  1. NoHttp封装--03 缓存

    1.Default模式,也是没有设置缓存模式时的默认模式 这个模式实现http协议中的内容,比如响应码是304时,当然还会结合E-Tag和LastModify等头. StringRequest req ...

  2. NoHttp封装--03 cookie

    NoHttp请求自动维持Cookie:   1.支持Session.Cookie.临时Cookie的位置.   2.支持App重启.关机开机后继续持久化维持.   3.提供了接口,允许开发者监听Coo ...

  3. NoHttp封装--02 自定义请求

    bean实体类请求: 1.bean import java.io.Serializable; import com.alibaba.fastjson.annotation.JSONField; pub ...

  4. NoHttp封装--01

    NoHttpActivity public class NoHttpActivity extends Activity implements View.OnClickListener { privat ...

  5. NoHttp封装--08 用一个实体类接收所有接口数据

    1.用户信息获取--bean实体类形式返回数据 ①服务器端: 代码: protected void onHandler(HttpServletRequest request, HttpServletR ...

  6. NoHttp封装--07 自定义异步任务框架

    MainActivity: public class MainActivity extends Activity implements View.OnClickListener { .... @Ove ...

  7. NoHttp封装--06 NoHttp之队列、队列优先级

    public class Main { /** * 程序入口 */ public void start() { // 第一种,先进先出的队列 // YolandaLinkedQueue queue = ...

  8. 一些免费收费api收藏

    转载:http://blog.csdn.net/sdjianfei/article/details/53157334 一 .api 1.http://apistore.baidu.com/astore ...

  9. 移动端开发者福利-免费收费api收藏

    一 .api 1.https://www.juhe.cn/ 跟百度api集市差不多,超级赞,做好认证就行了,我有20+认证能用的免费api 2.http://apistore.baidu.com/as ...

随机推荐

  1. C#6.0语言规范(一) 介绍

    C#(发音为“See Sharp”)是一种简单,现代,面向对象,类型安全的编程语言.C#源于C语言系列,对C,C ++和Java程序员来说很熟悉.EC#International将EC#标准化为ECM ...

  2. 实现instanceof关键字

    如果用Java的伪代码来表现Java语言规范所描述的运行时语义,会是这样: // obj instanceof T boolean result; if (obj == null) { result ...

  3. Win10手记-IIS部署网站问题解决

    最近在自己的Win10电脑上尝试部署ASP.NET网站时出现了问题,经过多方查找定位到IIS为问题来源. 开始之前 先描述下技术环境: 1.Windows 10 PC 2.Windows 自带的IIS ...

  4. [视频]K8飞刀 shellcode loader演示教程

    [视频]K8飞刀 shellcode loader演示教程 https://pan.baidu.com/s/1eQ77lPw

  5. java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

    答:是值传递.Java编程语言只有值传递参数. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用 ...

  6. gulp和grunt 分享ppt

    gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快的编写代码,而且大 ...

  7. 选择排序——Selection Sort

    基本思想: 在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换:第二次遍历n-2个数,找到最小的数值与第二个元素交换:...第n-1次遍历,找到最小的数值与第n-1个元素交换 ...

  8. Hadoop2源码分析-RPC探索实战

    1.概述 在<Hadoop2源码分析-RPC机制初识>博客中,我们对RPC机制有了初步的认识和了解,下面我们对Hadoop V2的RPC机制做进一步探索,在研究Hadoop V2的RPC机 ...

  9. LoadRuner12.53教程(二)

    使用HP Web访问示例应用程序 shǐ使   yòng用   H   P   W   e   b   fǎng访   wèn问   shì示   lì例   yìng应   yòng用   chén ...

  10. PHP官方网站及PHP手册

    每个人都知道php.net,我们或早或晚的都会来到这里并不断的访问它.它是PHPer的主要参考网站,拥有大量有用的信息,但是这些信息却不是那么显而易见. 比较有用的官方PHP资源: PHP官方函数手册 ...