android网络编程之HttpUrlConnection的讲解--实现文件断点下载

1、没有实现服务器端,下载地址为网上的一个下载链接。

2、网络开发不要忘记在配置文件中添加访问网络的权限

<uses-permission android:name="android.permission.INTERNET"/>

3、网络请求、处理不能在主线程中进行,一定要在子线程中进行。因为网络请求一般有1~3秒左右的延时,在主线程中进行造成主线程的停顿,对用户体验来说是致命的。(主线程应该只进行UI绘制,像网络请求、资源下载、各种耗时操作都应该放到子线程中)。

4、断点下载返回码为206,而不是200,断点请求失败的返回码为416。

5、

/**
 * 断点下载
 */
public class MoreTimesActivity extends Activity {
    private TextView mTvMsg;

    private String result = "";

    private long start = 0;
    private long stop = 1024 * 1024;

    private int times = 0;  // 根据文件大小自己设的,

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_times_download);

        initView();
    }

    private void initView(){
        mTvMsg = (TextView) findViewById(R.id.tv_msg);

        new Thread(moreThread).start();
    }

    private Thread moreThread = new Thread(){
        public void run() {
            HttpURLConnection connection = null;
            try {
                URL url = new URL("http://ftp-apk.pconline.com.cn/ef19af4e28462271af1117efaf868bc2/pub/download/201010/renshengrili_v4.0.04.05.apk");
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setDoInput(true);
                // 设置开始下载的位置和结束下载的位置,单位为字节
                connection.setRequestProperty("Range", "bytes=" + start + "-" + stop);

                String path = Environment.getExternalStorageDirectory().getPath()  + "/aaaaa/baidu_map.apk";
                // 断点下载使用的文件对象RandomAccessFile
                RandomAccessFile access = new RandomAccessFile(path, "rw");
                // 移动指针到开始位置
                access.seek(start);
                InputStream is = null;
                Log.e("ADB----", connection.getResponseCode() + "");
                if(connection.getResponseCode() == 206){
                    is = connection.getInputStream();
                    int count = 0;
                    byte[] buffer = new byte[1024];
                    while((count = is.read(buffer)) != -1){
                        access.write(buffer, 0, count);
                    }
                }

                if(access != null){
                    access.close();
                }
                if(is != null){
                    is.close();
                }

                start = stop + 1;
                stop += 1024*1024;   // 每次下载1M

                Message msg = Message.obtain();
                msg.what = 0;
                result += "文件" + times + "下载成功" + ":" + start + "---" + stop + "\n";
                moreHandler.sendMessage(msg);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(connection != null){
                    connection.disconnect();
                }
            }
        };
    };

    private Handler moreHandler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            if(msg.what == 0 && result!=null){
                if(times >= 10){
                    Message msg1 = Message.obtain();
                    msg1.what = 1;
                    moreHandler.sendMessage(msg1);
                }else{
                    new Thread(moreThread).start();
                    times += 1;
                }

                mTvMsg.setText(result);
            }else if(msg.what == 1){
                mTvMsg.setText(result);
            }
        };
    };
}

6、断点下载重要的是实现一:设置断点请求setRequestProperty("Range", "bytes=0-1024");

二:通过RandomAccessFile来将下载的字节插入到指定的位置。

7、如何实现多线程断点下载这里不再介绍,大家可以自己思考一下。

8、参考博文: http://blog.sina.com.cn/s/blog_413580c20100wmr8.html

http://my.oschina.net/u/141149/blog/55337

http://www.cnblogs.com/xyxiong/archive/2011/08/19/2145869.html

时间: 2024-10-25 17:01:19

android网络编程之HttpUrlConnection的讲解--实现文件断点下载的相关文章

android网络编程之HttpUrlConnection的讲解--GET请求

1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android.permission.INTERNET"/> 3.网络请求.处理不能在主线程中进行,一定要在子线程中进行.因为网络请求一般有1~3秒左右的延时,在主线程中进行造成主线程的停顿,对用户体验来说是致命的.(主线程应该只进行UI绘制,像网络请求.资源下载.各种耗时操作都应该放到子线程中). 4. p

android网络编程之HttpUrlConnection的讲解--上传大文件

1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android.permission.INTERNET"/> 3.网络请求.处理不能在主线程中进行,一定要在子线程中进行.因为网络请求一般有1~3秒左右的延时,在主线程中进行造成主线程的停顿,对用户体验来说是致命的.(主线程应该只进行UI绘制,像网络请求.资源下载.各种耗时操作都应该放到子线程中). 4.传输

android网络编程之pull解析xml

android网络编程之pull解析xml 除了前面介绍过的SAX以及DOM方法,还可以通过Pull对xml文档进行一个解析.Pull解析器的解析方式与SAX非常相似.它提供了类似的事件,使用parser.next()可以进入下一元素并触发相应事件,事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行选择,然后进行相应的处理,调用parser.nextText()方法可以获取下一个Text类型元素的值. pull解析器特点: *结构简单:一个接口.一个例外.一个工厂就组成了P

Android网络编程之http发送/请求服务

最近在学习Android网络编程的知识,以下是今晚学习的一些心得.与大家共同分享. 在实际的应用开发中很多时候需要app向服务器请求数据,那么app如何发送请求呢?下面的代码就是其中的一种情况,使用HttpURLConnection向服务器发送请求的数据,然后处理服务器返回的数据. 下面的代码只是客户端的一个简答测试代码.还需要在pc上安装一个 tomcat服务器 ,然后将demo中的jsp文件部署到tomcat上,具体的方法百度一下便知. package com.lee.nethttp; im

Android网络编程之Http通信

Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序.以下是本人在学习中的总结与归纳.1. HttpURLConnection接口    首先需要明确的是,Http通信中的POST和GET请求方式的不同.GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器.而POST方法的参数是放在Http请求中.因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式.    HttpURLConnectio

Android网络编程之Socket通信

Socket(套接字)是一种通信机制,可以实现单机或跨网络进行通信,其创建需要明确的区分C(客户端)/S(服务器端),支持多个客户端连接到同一个服务器.有两种传输模式: 1).面向连接的传输:基于TCP协议,可靠性高,但效率低: 2).面向无连接的传输:基于UDP协议,可靠性低,但效率高: Android中,直接采用Socket通信应该是我们遇到的最低级的网络运用.尽管已经作了很大程度的抽象,但是纯粹的Socket通信,仍然给开发者留下很多细节需要处理,尤其在服务器端,开发者需要处理多线程以及数

Android网络编程之Apache接口

一,通过Apache接口访问网络所必须的类 HttpClient 概述 ---HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议.(摘自百度百科) 成员变量 构造方法 ---DefaultHttpClient() 普通方法 ---execute()//发送请求,需要一个表示请求方法的对象作为参数,返回一个封装了响应信息的HttpResponse对

核心技术篇:6.android网络编程之json解析

前言:好一段时间没写博客了,说最近挺忙的,感觉像是个借口,每天还是同样的24个小时,每天还是同样的5:30就准时下班,每天晚上还是有大量的空余时间...最直接的原因就是,最近堕落了.脑子里也时常会有很多想法浮现,都是些比较实际的想法,但往往就是浮现那一下,心情激动了一下,心里默默告诉自己,有时间就要这么做...好多想法都被一些其它的诱惑给磨灭掉了,要么是打球.要么是看电影.要么是处理一些乱七八糟的事去了.总之,近段时间,花在技术上的时间很少很少,好好反思下. 前段时间,来了一位新疆的客户,提出了

Android网络编程之WebView【实例解析】

WebView 作用: 可以把一个网页在手机客服端以View的方式显示(实质上是一个网页) MainActivity代码[实例解析] package com.example.webview; import android.os.Bundle; import android.app.Activity; import android.view.KeyEvent; import android.view.Menu; import android.view.Window; import android.