Android xutils 分析修改 下载进度更新频率

因为在更新进度的时候,有点卡,所以想,减缓进度更新的间隔时间。使其不那么频繁。

直接看代码分析下。

HttpHandler.java 实现了RequestCallBackHandler的下载进度监听

 private ResponseInfo<T> handleResponse(HttpResponse response) throws HttpException, IOException {
        if (response == null) {
            throw new HttpException("response is null");
        }
        if (isCancelled()) return null;

        StatusLine status = response.getStatusLine();
        int statusCode = status.getStatusCode();
        if (statusCode < 300) {
            Object result = null;
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                isUploading = false;
                if (isDownloadingFile) {
                    autoResume = autoResume && OtherUtils.isSupportRange(response);
                    String responseFileName = autoRename ? OtherUtils.getFileNameFromHttpResponse(response) : null;
                    FileDownloadHandler downloadHandler = new FileDownloadHandler();
                   <span style="color:#ff0000;"> result = downloadHandler.handleEntity(entity, this, fileSavePath, autoResume, responseFileName); //在这里我找到了,进度接口实现的实体了,我们点进去看看。</span>
                } else {
                    StringDownloadHandler downloadHandler = new StringDownloadHandler();
                   <span style="color:#ff0000;"> result = downloadHandler.handleEntity(entity, this, charset);</span>
                    if (HttpUtils.sHttpCache.isEnabled(requestMethod)) {
                        HttpUtils.sHttpCache.put(requestUrl, (String) result, expiry);
                    }
                }
            }
            return new ResponseInfo<T>(response, (T) result, false);
        } else if (statusCode == 301 || statusCode == 302) {
            if (httpRedirectHandler == null) {
                httpRedirectHandler = new DefaultHttpRedirectHandler();
            }
            HttpRequestBase request = httpRedirectHandler.getDirectRequest(response);
            if (request != null) {
                return this.sendRequest(request);
            }
        } else if (statusCode == 416) {
            throw new HttpException(statusCode, "maybe the file has downloaded completely");
        } else {
            throw new HttpException(statusCode, status.getReasonPhrase());
        }
        return null;
    }

FileDownloadHandler.java里面,xutils对进度的更新做了如下操作。

如果处于进度更新状态,就让其走间隔更新进度,其他状态不进行间隔设置。

public class FileDownloadHandler {

    public File handleEntity(HttpEntity entity,
                             RequestCallBackHandler callBackHandler,
                             String target,
                             boolean isResume,
                             String responseFileName) throws IOException {
        if (entity == null || TextUtils.isEmpty(target)) {
            return null;
        }

        File targetFile = new File(target);

        if (!targetFile.exists()) {
            File dir = targetFile.getParentFile();
            if (dir.exists() || dir.mkdirs()) {
                targetFile.createNewFile();
            }
        }

        long current = 0;
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            FileOutputStream fileOutputStream = null;
            if (isResume) {
                current = targetFile.length();
                fileOutputStream = new FileOutputStream(target, true);
            } else {
                fileOutputStream = new FileOutputStream(target);
            }
            long total = entity.getContentLength() + current;
            bis = new BufferedInputStream(entity.getContent());
            bos = new BufferedOutputStream(fileOutputStream);

            if (callBackHandler != null && !callBackHandler.updateProgress(total, current, true)) {
                return targetFile;
            }

            byte[] tmp = new byte[4096];
            int len;
            while ((len = bis.read(tmp)) != -1) {
                bos.write(tmp, 0, len);
                current += len;
                if (callBackHandler != null) {
                 <span style="color:#ff0000;">   if (!callBackHandler.updateProgress(total, current, false)) {  //进度更新,有更新的频率</span>
                        return targetFile;
                    }
                }
            }
            bos.flush();
            if (callBackHandler != null) {
              <span style="color:#ff0000;">  callBackHandler.updateProgress(total, current, true);//必须更新</span>
            }
        } finally {
            IOUtils.closeQuietly(bis);
            IOUtils.closeQuietly(bos);
        }

        if (targetFile.exists() && !TextUtils.isEmpty(responseFileName)) {
            File newFile = new File(targetFile.getParent(), responseFileName);
            while (newFile.exists()) {
                newFile = new File(targetFile.getParent(), System.currentTimeMillis() + responseFileName);
            }
            return targetFile.renameTo(newFile) ? newFile : targetFile;
        } else {
            return targetFile;
        }
    }

}

最后,我们回到HttpHandler.java里面

    private long lastUpdateTime;

    @Override
    public boolean updateProgress(long total, long current, boolean forceUpdateUI) {
        if (callback != null && this.state != State.CANCELLED) {
            if (forceUpdateUI) {
               <span style="color:#ff0000;"> this.publishProgress(UPDATE_LOADING, total, current); </span>
            } else {
                long currTime = SystemClock.uptimeMillis();
                if (currTime - lastUpdateTime >= callback.getRate()) {
                    lastUpdateTime = currTime;
                   <span style="color:#ff0000;"> this.publishProgress(UPDATE_LOADING, total, current);</span><span style="color: rgb(255, 0, 0); font-family: Arial, Helvetica, sans-serif;"> //间隔一定时间进行更新 进度</span><span style="color:#ff0000;">
</span>
                }
            }
        }
        return this.state != State.CANCELLED;
    }

最后,到哪里设置呢。间隔时间呢。

到RequestCallBack.java

private static final int DEFAULT_RATE = 1000;

private static final int MIN_RATE = 200;

//修改这里即可。完毕

public final int getRate() {

if (rate < MIN_RATE) {

return MIN_RATE;

}

return rate;

}

或者通过在 callback里面去 setRate(2000)都可以。

时间: 2024-07-28 19:33:12

Android xutils 分析修改 下载进度更新频率的相关文章

android异步任务图片下载(进度条提示进度)

一.AsyncTask介绍 Android提供了几种在其他线程中访问UI线程的方法. Activity.runOnUiThread( Runnable ) View.post( Runnable ) View.postDelayed( Runnable, long ) Hanlder 这些类或方法同样会使你的代码很复杂很难理解.然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕. 为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界

Android多线程分析之五:使用AsyncTask异步下载图像

Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<Android多线程分析之中的一个:使用Thread异步下载图像>中.曾演示了怎样使用 Thread 来完毕异步任务. Android 为了简化在 UI 线程中完毕异步任务(毕竟 UI 线程是 app 最重要的线程).实现了一个名为 AysncTask 的模板类.使用 AysncTask 能够在异步任务进行的同

App下载更新、数据库断点续传、通知栏更新下载进度、Https传服务器Json并且解析对象

点击打开链接,免积分下载 下载的apk是一个真实的项目,是一个双开+系统通讯录拨号  跟系统的拦截(运用了Hook.DroidPlugin技术) 先说下这个小例子的一个总体代码思路: 下面的界面是主界面,这个界面就是判断当前的app版本,跟服务器的版本是否一致,更服务器交互,获取app的更新内容.版本信息.下载地址,如果一致就没有更新的标志,如果不一致,就显示更新的标志, 然后带着服务器返回的新版本号.更新内容.下载地址更新到下面这个页面,然后就是更新下载操作 我们先来看第一个页面吧: priv

【黑马Android】(07)多线程下载的原理/开源项目xutils/显示意图/隐式意图/人品计算器/开启activity获取返回值

多线程下载的原理 司马光砸缸,多开几个小水管,抢救小朋友. import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import

Android中如何下载文件并显示下载进度

原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Service和使用DownloadManager. 一.使用AsyncTask并在进度对话框中显示下载进度 这种方式的优势是你可以在后台执行下载任务的同时,也可以更新UI(这里我们用progress bar来更新下载进度) 下面的代码是使用的例子 1 // declare the dialog as a

Android多线程分析之一:使用Thread异步下载图像

罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Message, AysncTask,当然不可避免地要涉及到 native 方法,因此也会分析 dalvik 中和线程以及消息处理相关的代码:如 dalvik 中的 C++ Thread 类以及 Message

Android中使用AsyncTask实现文件下载以及进度更新提示

Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handter即可实现.AsyncTask是抽象类.AsyncTask定义了三种泛型类型Params,Progress和Result: Params启动任务执行的输入参数,比如,HTTP请求的URL. Progress后台任务执行的百分比. Result后台执行任务最终返回的结果,比如String.

改进xutils下载管理器,使其,在随意地方进行进度更新,以及其它状态监听操作

1.前面在做下载进度监听.尝试过,通过加入 弱引用的View进度条,到相应的集合. 等到要进行更新进度的时候.通过Key 获取相应的VIew来进行更新 进度条.效果是达到了,可是我们怎样来监听其它的状态呢,不好监听. 2.又想过通过每一个 下载APP.都有一个相应的List<DownloadListem> 对象,然后我们将进度监听.都加入进去,待更新进度的时候. for循环来进行. 可是这样要考虑,activity onResume onPase的时候,不须要更新界面.麻烦事情. 3.最后,方

Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度

在开发过程中,总会需要从网络上下载文件,有时候还需要将下载进度显示在下拉菜单中. 现在写了一个Demo,封装了AsyncTask下载文件和进度显示的代码,以后在做项目的时候能够直接进行使用. 效果图: 主界面只有一个按钮,比较简单: / layout / activity_main.xml : <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="h