//我主要是好奇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. uav 11258 String Partition (DP)

    Problem F - String Partition                                                                         ...

  2. Raw-OS互斥的源代码分析的量的Mutex

    作为分析的内核版本2014-04-15,基于1.05正式版.blogs我们会跟上的内核开发进度的最新版本,如果出现源代码的目光"???"的话,没有深究的部分是理解. Raw-OS官 ...

  3. HDD-FAT32 ZIP-FAT32

    在使用U当家U盘启动盘制作工具的时候会看到一个模式的选项,模式分为HDD-FAT32和ZIP-FAT32两个常用的模式,其它的模式几乎用不到的.那么HDD-FAT32和ZIP-FAT32模式到底有什么 ...

  4. POJ1251 Jungle Roads 【最小生成树Prim】

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19536   Accepted: 8970 Des ...

  5. design pattern Builder 生成器设计模式

    其实设计模式可以学习很有趣,你并不需要有这么难啃旱地FOG对我来说,当然,这些都是健康的骨骼啃啃. 在本文中,建造者模式设计一个搞笑的一幕.根据这一模型来学习功夫的方法,哈哈. 基类的第一,设计.那么 ...

  6. C++ 堆 和 堆 分析

    [摘要] 堆和栈,即是数据结构,又是分配存储空间的不同方式.在数据结构上.堆是树型层次结构,结点按keyword次序排列,经常使用的堆为二叉堆:栈是一种先进后出的数据结构.在内存分配上的堆和栈,首要差 ...

  7. 将android界面背景设置为黑色

    屏幕背景设置为黑色的几种方式: 新建项目时候 第二次next之后(不同sdk版本号可能不同),Background Color项点击可选. 开公布局文件,选择视图查看 就是下边二个选项卡中的第一个(G ...

  8. SVN与eclipse整合和利用、SVN与Apache综合

    SVN与eclipse综合 下载SVN插入(http://subclipse.tigris.org) http://subclipse.tigris.org/servlets/ProjectDocum ...

  9. net中使用ETW事件

    在.net中使用ETW事件的方法   直到.net4.5,才有了比较便利的操作ETW的方法. 本文介绍的方法主要来源于Microsoft.Diagnostics.Tracing.TraceEvent官 ...

  10. Tempdb怎么会成为性能瓶颈

    原文:Tempdb怎么会成为性能瓶颈 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/25/tempdb.aspx 我曾经遇到过这样一个性能问题. ...