Edwin Guo's Blog home

Http download

RefClass:
com.guo.android_extend.network.HttpDownloader
com.guo.android_extend.network.HttpDownloadThread

Http下载部分和Bitmap异步延迟刷新机制是一样的。主要的函数如下:

/**
 * download the object.
 * 
 * @param url
 * @param localdir
 * @return true if success.
 */
public boolean syncDownload() {
    String cache = getLocalDownloadFile();

    try {
        URL url = new URL(mUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(30000);
        conn.setReadTimeout(30000);
        conn.setInstanceFollowRedirects(true);

        InputStream is = conn.getInputStream();
        File file = new File(cache);
        OutputStream os = new FileOutputStream(file);

        byte[] bytes = new byte[1024];
        int length = 0;
        while ((length = is.read(bytes, 0, 1024)) != -1) {
            os.write(bytes, 0, length);
        }
        os.close();
        is.close();
        conn.disconnect();

        file.renameTo(new File(getLocalFile()));
        return true;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return false;
}

处理下载的主要函数,可以重载,和decode的调用时机一样,调用结束之后,接着调用finish的接口。使用时,需要实现finush的接口,这个接口会告诉你什么时候下载结束了,是不是下载成功的消息,这里仅仅是进行了简化的处理,无论是网络连接失败还是写文件失败,还是其他IO问题都归结为下载失败。所以需要对网络连接部分和IO进行处理的话,要重新写过。 工程中提供的是简易的下载流程,单线程排队下载,所以如果是网络图片的显示,需要在下载失败时,重新发起下载请求。


考虑到简易的排队下载流程使用场合不多,对这部分重新进行了调整。

RefClass:
com.guo.android_extend.network.Downloader
com.guo.android_extend.network.DownloaderManager
com.guo.android_extend.network.DownloaderStructure

调整之后 DownloaderManager 内放了一个线程池,默认开启5个下载线程处理5个下载任务。

**每个Downloader代表了一个下载任务,分配有独立的唯一的ID,这部分需要使用者控制,确保唯一。构造时,需要传入一个Url以及一个本地目录存放下载文件,下载的临时文件名为同目录下cache结尾的文件。 **

Downloader包含onDownloadUpdate,onTaskOver,onDownloadFinish,三个回调,update时,android上不能直接更新UI,需要用handler等post到主线程更新。

onFinsh时代表下载已经结束,但数据仍然还在cache的文件。onTaskOver时,真正结束任务,这里需要注意的是继承时 仍然需要调用父类的接口,这是因为任务结束时需要把任务从DownloaderManager的列表中删除,否则有相同ID的下载任务无法再次提交。


RefClass:
com.guo.android_extend.network.http.Downloader
com.guo.android_extend.network.http.DownloaderManager
com.guo.android_extend.network.NetWrokFile

下载模块移动到http代码包,DownloaderStructure 更名为NetWorkFile,也提供socket 模块文件传输使用。

Fork me on GitHub