Xutils源码文件下载方法的调用流程

//我主要是好奇Xutils是在哪里回调onLoading(),找老半天没找到,好不容易找到就写下来吧

前言:

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-08-04 15:59:55

Xutils源码文件下载方法的调用流程的相关文章

RxJava &amp;&amp; Agera 从源码简要分析基本调用流程(2)

版权声明:本文由晋中望原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/124 来源:腾云阁 https://www.qcloud.com/community 接上篇RxJava && Agera 从源码简要分析基本调用流程(1)我们从"1.订阅过程"."2.变换过程"进行分析,下篇文章我们继续分析"3.线程切换过程" 3.线程切换过程 从上文中我们知道了R

RxJava &amp;&amp; Agera 从源码简要分析基本调用流程(1)

版权声明:本文由晋中望原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/123 来源:腾云阁 https://www.qcloud.com/community 相信很多做Android或是Java研发的同学对RxJava应该都早有耳闻了,尤其是在Android开发的圈子里,RxJava渐渐开始广为流行.同样有很多同学已经开始在自己的项目中使用RxJava.它能够帮助我们在处理异步事件时能够省去那些复杂而繁琐的代码,尤其是当

Linux内核源码分析方法

  一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写.编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内.如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码.通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一

Solr4.8.0源码分析(5)之查询流程分析总述

Solr4.8.0源码分析(5)之查询流程分析总述 前面已经写到,solr查询是通过http发送命令,solr servlet接受并进行处理.所以solr的查询流程从SolrDispatchsFilter的dofilter开始.dofilter包含了对http的各个请求的操作.Solr的查询方式有很多,比如q,fq等,本章只关注select和q.页面下发的查询请求如下:http://localhost:8080/solr/test/select?q=code%3A%E8%BE%BD*+AND+l

源码阅读系列:源码阅读方法

一.前提条件 1.纯熟扎实的语言基础 ??如果你学java,却对反射.泛型.注解一直半解,还是不要去读什么框架了,回去把java基础打扎实反而对你自身更有益. 2.UML能力 ??在软件工程中,UML在软件的不同生命周期阶段扮演着非常重要的角色,没有好的UML水平,面对大型的项目源码会束手无策. 3.对业务的理解 ??如果你要阅读的项目业务性比较强,事先对业务有一定的了解是必须的. 4.设计模式.重构的掌握 ??编程语言什么的没什么好说.着重提一个:设计模式由于Android源代码用到各种各样的

分享》:关于阅读开源项目的源码思路方法

关于阅读开源项目的源码思路方法:<不喜勿喷> 一般开源项目, 如果这个项目你很熟悉经常用, 那么你直接从 main 入手没问题.. 如果你不熟悉或者代码量很大, 最好从代码的 example 代码 或者 client 的代码入手比较容易. 这些代码直接 gdb 进去就可以调试运行了, 客户端的功能搞清楚了,会用了, 恐惧感就降下去了, 再看服务端就容易了. 看 c 代码要 关注主体核心 struct , 整个server, client 可能都是围绕整个 struct 运行起来的, 这个str

通过官方API结合源码,如何分析程序流程

通过官方API结合源码,如何分析程序流程通过官方API找到我们关注的API的某个方法,然后把整个流程执行起来,然后在idea中,把我们关注的方法打上断点,然后通过Step Out,从内向外一层一层分析调用链,然后找出我们要分析的流程的逆流程,然后再通过在每层上面打上断点,进而整理出代码的执行流程:其实,对于面向对象语言,由于有了多态特性,代码中有了很复杂的抽象结构,一个接口或者抽象类有很多的实现,有时通过代码可以看出来,有些不太好看,程序执行时到底调用了哪个实现类的方法,这就需要按照上面动态的方

Mybatis源码阅读之--整体执行流程

Mybatis执行流程分析 Mybatis执行SQL语句可以使用两种方式: 使用SqlSession执行update/delete/insert/select操作 使用SqlSession获得对应的Mapper,然后调用mapper的相应方法执行语句 其中第二种方式获取Mapper的流程在前面已经解析过,请查看文章Mybatis源码阅读之--Mapper执行流程 其实这个方法最后的MapperMthod也是调用SqlSession的相应方法执行增删该的操作,这边文章主要介绍SqlSession执

Cocos2dx源码赏析(1)之启动流程与主循环

Cocos2dx源码赏析(1)之启动流程与主循环 我们知道Cocos2dx是一款开源的跨平台游戏引擎,而学习开源项目一个较实用的办法就是读源码.所谓,"源码之前,了无秘密".而笔者从事的也是游戏开发工作,因此,通过梳理下源码的脉络,来加深对Cocos2dx游戏引擎的理解. 既然,Cocos2dx是跨平台的,那么,就有针对不同平台运行的入口以及维持引擎运转的"死循环".下面,就分别从Windows.Android.iOS三个平台说明下Cocos2dx从启动到进入主循环