Xutils呼叫流源代码文件下载方法

//我主要是好奇Xutils哪里回调onLoading(),查找等了很久也没找到,果然easy查找只是把它写下来

前言:

1.代码摘要只有主线,提供一般流程

2.为了易于理解,码变量名,而是类名的驼峰式写法。如源代码中:WorkRunnable mWorker,在本文中为 workRunnable

3.须要配合看Xutils的源代码,能够让你看Xutils源代码时降低一定的难度

代码主干:

HttpFragment:

//HttpFragment是Xutils自带样例中的一个类

httpUtils = new HttpUtils();

httpUtils.send(mthord, url, params, callback{ onStart(), onLoading(), onSuccess(),  onFailure, })

HttpUtils:

httpRequest = new HttpRequest(method, url);

httpUtils.sendRequest(request, params, callback);

httpHandler = new Handler<T>(httpClient, httpContext, resoponseTextCharset, callBack);

httpRequest.setRequestParams(params, httpHandler);

httpHandler.executeOnExcutor(priorityExecutor, request);

PriorityAsynTask == HttpHandler:

//HttpHandler extends PriorityAsyncTask,故下面方法实际上调用的是HttpHandler中的方法

//Thread能够运行的有两类接口 1.Runable()接口 2.Callable接口

//差别是分别调用run()、call()开线程;后者有返回值,可取消作业,能够返回异常

//然而想要用Thread调用Callable须要用FutreTask包装。FutureTask实现了Runable接口,done()方法在作业结束后运行,可用来推断下载成功、取消等状态;

//以下两行代码是初始化。不在运行顺序中

workRunnable{ call(){ return postResult(doInBackground(parmas)}};

futureTask = new FutureTask<Result>(workRunnable){ done( postResultIfNotInvoke())};

workRunnable.mParams = params;

priorityExecutor.execute(new PriorityRunnable(priority, futureTask));

PriorityExecutor:

//用线程池来开线程

threadPoolExecutor.execute(new PriorityRunnable(priority, futrueTask))

PriorityRunnable:

//futureTask是workRunnable包装类,调用的是workRunnable里的方法,即postResult(doInBackground(parmas);

futrueTask.run();

HttpHandler:

//最终执行HttpHandler的doInBackground了

httpHandler.doInBackground();

httpHandler.sendRequest(httpRequest);

httpResponse = client.execute(httpRequest, context);

handleResponse(httpResponse);

fileDownloadHandler.handleEntity(httpEntity, httpHandler, charset);

StringDownloadHandler:

//最终到下载处理阶段了。

O(∩_∩)O哈哈~

while ((line = reader.readLine()) != null) {

httpHandler.updateProgress(total, current, false)

}

HttpHandler:

httpHandler.publishProgress(UPDATE_LOADING, total, current);

//values = new Progress[]{UPDATE_LOADING, total, current}; 利用Java的不确定数量的形參机制,即(Profress... )

//利用Handler机制通信

handler.obtainMessage(MESSAGE_POST_PROGRESS,

new AsyncTaskResult<Progress>(this, values))

//priorityAsyncTask就是httpHandler

asyncTaskResult.priorityAsyncTask.onProgressUpdate(values);

//依据values[0]推断为正在下载

requestCallBack.onLoading(

Long.valueOf(String.valueOf(values[1])),//文件总大小

Long.valueOf(String.valueOf(values[2])),//已下载大小

isUploading);

//好了到这里就结束了,其它的開始下载、下载完、下载失败的回调函数的逻辑于此类似。

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-10-23 22:31:25

Xutils呼叫流源代码文件下载方法的相关文章

java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件

字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 1 private static void write() throws IOException { 2 //创建字符输出缓冲流 3 BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")); 4 for(int x = 0;x < 10 ; x++){ 5 bw.write(&quo

GitHub上下载源代码的方法

GitHub上找到自己要下载的项目以后,有3种方法可以下载源代码. 第一种是复制该项目的地址,然后用其他软件下载: 第二种是安装了官方客户端,可以直接点击"Clone in Desktop"下载,好像客户端只有Windows Vista, 7, 8的,没有XP的: 第三种是点击"Download ZIP",直接下载ZIP文件. GitHub上下载源代码的方法,布布扣,bubuko.com

Android源代码下载方法具体解释

作者:张星 相信非常多下载过内核的人都对这个非常熟悉 git clone git://android.git.kernel.org/kernel/common.git kernel 可是这是在曾经,如今假设这么运行的话,会显演示样例如以下内容 Initialized empty Git repository in /home/star/working/kernel/.git/ android.git.kernel.org[0: 149.20.4.77]: errno=Connection ref

ASCX呼叫ASPX.CS的方法

为了安全设计,一般情况之下,改用为接口(interface).在网页中实现这个接口:用户控件:当然,把用户控件ascx拉至网页之后,在用户控件的linkbutton的click事件,就可以呼叫至网页的方法了:演示:原本写完成了,但插入一些另外在网上看到的方法,很多网友就会想到,直接把this.page转为_Default网页类即可.如:实现如下: 这样根本是无法呼叫得到.为什么呢?先要了解用户控件,是用户控件的应用,是因为多个网页出现相同代码,功能相同而出现用户控件.这个的话,用户控件写好之后,

php查看网页源代码的方法

这篇文章主要介绍了php查看网页源代码的方法,涉及php读取网页文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了php查看网页源代码的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 <?php $url = "http://www.jb51.net"; $fp = @fopen($url, 'r') or die("Cannot Open $url via Get method"); while (

jQuery实现瀑布流的简单方法

HTML代码 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>waterFall</title> <link rel="stylesheet" href="wf.css"> <script src="jquery.js">

Linux内核源代码分析方法

Linux内核源代码分析方法   一.内核源代码之我见 Linux内核代码的庞大令不少人"望而生畏",也正由于如此,使得人们对Linux的了解仅处于泛泛的层次.假设想透析Linux,深入操作系统的本质,阅读内核源代码是最有效的途径.我们都知道,想成为优秀的程序猿,须要大量的实践和代码的编写.编程固然重要,可是往往仅仅编程的人非常easy把自己局限在自己的知识领域内.假设要扩展自己知识的广度,我们须要多接触其它人编写的代码,尤其是水平比我们更高的人编写的代码.通过这样的途径,我们能够跳出

各种流的使用方法。

Java.util.Properties:一个可以将键值进行持久化存储的对象.Map--Hashtable的子类. Map |--Hashtable |--Properties:用于属性配置文件,键和值都是字符串类型. 特点:1:可以持久化存储数据.2:键值都是字符串.3:一般用于配置文件. |-- load():将流中的数据加载进集合. 原理:其实就是将读取流和指定文件相关联,并读取一行数据,因为数据是规则的key=value,所以获取一行后,通过 = 对该行数据进行切割,左边就是键,右边就是

ASHX呼叫ASPX.cs的方法

问题来自论坛,有网友这样的要求,在ASHX内呼叫ASPX.cs的一个方法或函数. 在一个网站中,也许不止只有一个aspx网页.把aspx.cs内的方法宣告为public,ashx想呼叫时,也不知道是哪一个aspx内的方法.就是某一个aspx.cs有引用了这个ashx,这个ashx也不知道呼叫的方法在当前这个aspx中. 为了解决上面的问题,Insus.NET创建一个接口(interface) 在站点中,创建一个aspx,名称暂叫A.aspx.在a.aspx没有写任何代码,但在a.aspx.cs内