//我主要是好奇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);
//好了到这里就结束了,其它的開始下载、下载完、下载失败的回调函数的逻辑于此类似。

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

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

  1. php查看网页源代码的方法

    这篇文章主要介绍了php查看网页源代码的方法,涉及php读取网页文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php查看网页源代码的方法.分享给大家供大家参考.具体实现 ...

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

    字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 private static void write() throws IO ...

  3. Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流的解决方法

    原本在CS项目中用的好好的在BS项目中既然提示我导出出现无法访问已关闭的流的解决方法 比较郁闷经过研究 终于解决了先将方法发出来 让遇到此问题的筒子们以作参考 //新建类 重写Npoi流方法 publ ...

  4. spring+jpg环境下,spring实现文件下载web实现通用的文件下载方法

    jar包复制到WEB-INF 文件夹lib下: commons-io-1.3.2.jar public static String download(HttpServletRequest reques ...

  5. ASHX呼叫ASPX.cs的方法

    ASHX呼叫ASPX.cs的方法 问题来自论坛,有网友这样的要求,在ASHX内呼叫ASPX.cs的一个方法或函数. 在一个网站中,也许不止只有一个aspx网页.把aspx.cs内的方法宣告为publi ...

  6. java字符流操作flush()方法及其注意事项

    java字符流操作flush()方法及其注意事项   flush()方法介绍 查阅文档可以发现,IO流中每一个类都实现了Closeable接口,它们进行资源操作之后都需要执行close()方法将流关闭 ...

  7. ASCX呼叫ASPX.CS的方法

    为了安全设计,一般情况之下,改用为接口(interface). 在网页中实现这个接口: 用户控件: 当然,把用户控件ascx拉至网页之后,在用户控件的linkbutton的click事件,就可以呼叫至 ...

  8. 呼叫WCF Service的方法出现Method not allowed异常

    asp.net mvc练习程序,经常性在家里电脑,笔记本或是公司的电脑之间拷贝与粘贴,如果忘记携带最新的练习程序,一些小功能只能重新写了.如前一篇<ASP.NET MVC呼叫WCF Servic ...

  9. ASP.NET MVC呼叫WCF Service的方法

    本演示,Insus.NET操练asp.net mvc的应用程序,虽然以前有写过:<MVC应用程序使用Wcf Service>http://www.cnblogs.com/insus/p/3 ...

随机推荐

  1. C#中调用c++的dll

    C#中调用c++的dll具体创建与调用步骤,亲测有效~   使用的工具是VS2010哦~其他工具暂时还没试过 我新建的工程名是my21dll,所以会生成2个同名文件.接下来需要改动的只有画横线的部分 ...

  2. 两次fclose引发的血案

    代码本来在Windows上开发的,功能基本完毕迁移到Linux上,结果一跑,乱象重重.这里只列出两个.   一崩溃: /mnt/diskc/db/app/bin/mysqld: double free ...

  3. 完美世界3D格斗手游[格斗宝贝]今日公測

    狗刨学习网报道 / 经过近两年井喷式的发展,国内手游市场洗牌的信号愈加强烈.用户体验的提升.以及对产品核心品质的要求.促进了手游的精品化.而白热化的市场竞争,也催生了各大厂商在细分市场的抢滩.当中.更 ...

  4. 如何使用 iOS 7 的 AVSpeechSynthesizer 国家有声读物(4)

    控制:我们一定要学会控制 尤达大师(电影<星球大战>)有话:的关键在于控制.这本故事书是一个字一个字读出来,我愿意为它添加两个button,音调和语速,以便我们能够调整语音合成实时的时候. ...

  5. jsp、Servlet相关知识介绍(转)

    1.servlet生命周期 所谓生命周期,指的是servlet容器如何创建servlet实例.分配其资源.调用其方法.并销毁其实例的整个过程. 阶段一: 实例化(就是创建servlet对象,调用构造器 ...

  6. cocos2d-html5基金会

    1 环境结构 版本号Cocos2d-html5-v2.2,tomcat7.0 构造tomcat.然后直接解压Cocos2d-html5-v2.2.zip.解压后根文件访问的文件夹index.html你 ...

  7. DDD领域驱动设计初探

    DDD领域驱动设计初探1 前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的.今天看到一篇博文里面写道:越是忙人越有时间写博客.呵呵,似乎有点道理,博主为了证明自己也是忙人,这不就来学习下D ...

  8. Simditor图片上传

    上一篇文章(Simditor用法)仅仅是简单的默认配置,我们可自己定义工具栏button使其更丰富和实现上传图片功能 初始化编辑器 <script type="text/javascr ...

  9. Linux 编程学习笔记----动笔makefile档

    Befroe Beginning. 在设置暑假的plan ,关于Linux的书籍如今在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 如今開始关于Linux ...

  10. git 配置多个SSH-Key(转)

    摘要 我们在日常工作中会遇到公司有个gitlab,还有些自己的一些项目放在github上.这样就导致我们要配置不同的ssh-key对应不同的环境. 目录[-] 1,生成一个公司用的SSH-Key 2, ...