• Android下的联网下载的操作


    一:从网络下载图片

    MainActivity:

    NetService

     1.由路径获取Url

    2.使用url打开HttpURLConnection连接

    3.根据路径查找本地sd卡是否有缓存文件,如果文件存在,发送最后修改时间

    File file = new File("/mnt/sdcard/" + URLEncoder.encode(path, "UTF-8"));

    conn.setIfModifiedSince(file.lastModified());

    4.得到响应返回码,如果返回码是200,则正确得到网络连接

    5.由连接获取输入流,将输入流写入到内存,由于是图片,所以为byte,

    6.将内存中的数据赋给byte数组data,

    7.用Bitmap的解码工厂将数据解码为图片

    Bitmap image = BitmapFactory.decodeByteArray(data,0,data.length);

    8,为了以后省流量,快速访问,将此图片缓存到本地

    二:登录:

     classicLogin:

      点击登录时开始新线程

         1.获得用户名与密码

     2.调用服务层的方法为用户名与密码设置编码:

    Service.post(username,password)

         3.若无异常提示成功,否则提示失败

    服务层的方法:

    1.设置处理用户名与密码的Servlet路径:

      private String path = "http://192.168.1.100:8080/05.Web/LoginServlet"

    1.post方法:

      1.Creates a new URL instance by parsing spec.

         URL url = new URL(path);

      2.获取HttpURLConnection连接

      3.设置连接超时时间

      4.设置请求方法为post

      5.设置三个请求头

            conn.setRequestProperty("Content-Type""application/x-www-form-urlencoded");

    conn.setRequestProperty("Content-Length", params.getBytes().length + "");

    conn.setRequestProperty("Host""192.168.1.100:8080");

       6.Sets the flag indicating whether this URLConnection allows output

    conn.setDoOutput(ture);

       7.将得到的用户名密码编码后输出
    username = URLEncoder.encode(username,"utf-8")

    conn.getOutputStream().write(username.getBytes());

     8.得到响应码,若响应码不是200,则抛出异常。

    3.get方式:

    1.get方式是:http://192.168.1.100:8080/05.Web/LoginServlet?username=xxx&password=xxx

    所以在创建URL时应遵照这种格式:

    String path =  "http://192.168.1.100:8080/05.Web/LoginServlet";

    String params = "username=" + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8");

    URL url = new URL(path + "?" + params);

    2.打开HttpURLConnection连接

    3.设置连接超时时间

    4.设置请求方法

    5.开始连接,得到返回码

    6.根据返回码判断网络状态

    4.牛逼的方式:

    常见的麻烦的方法已经有人写好了,自己可以直接拿来调用:

    1.MainActivity

    private AsyncHttpClient client = new AsyncHttpClient();

    2.在点击登录时调用clientpostget方法即可:

    client.post(url, params, responseHandler)

    client.get(url, params, responseHandler)

    三:上传:

       上传这种常见的麻烦的方法也被同一个牛逼人物写好了,同上,直接调用

    类似的,把将要上传的文件也放入params:

         RequestParams params = new RequestParams();

         params.put("username", username);

         params.put("password", password);

     params.put("upload"new File(upload));

     

    client.post(url, params, new AsyncHttpResponseHandler();

    四:下载

    1.java中最简单的下载

    1.找到文件所在的路径:

    URL url = new URL(http:xxxx/xx.txt);

    2.打开http连接

    3.设置连接超时时间

    4.设置请求方式

    5.开始连接得到响应码

    6.响应码正确(200)则将由连接得到的输入流中的数据写入到本地

    2.多线程下载:

         一:DownloadTask:继承Thread,规定线程数THREAD_AMOUNT = 3;

    1.DownloadTask的构造函数中传入下载地址,从下载地址中截取文件名

    2.run方法

    a) :打开连接,设置超时时间

    b) :获取文件长度 :conn.getConntentLength();

    c) :计算每个线程要下载的长度

    d) :开启所有线程,每个线程会下载一部分数据到本地文件中

    New DownloadThread(i).start();

           二:内部类DownloadThread:继承Thread,构造函数中传递的参数用来标记下载任务中的线程

            1.run方法:

    a) :设置当前线程要下载的起始位置,结束位置

    b) :当前线程打开Http连接,设置超时时间,设置请求下载的范围

    c) :用随机读写文件地文件读写,此时同单线程下载操作

    3.多线程断点续传:

     在多线程的基础上修改:添加一个临时文件记录当前线程下载到了哪一个字节了,然后下次再启动时,直接从当前临时文件所记录的地方接着下载.

    :BPDownloadTask中的修改

       a) :BPDownloadTask的构造函数中创建临时文件.

           b) :run方法启动时,要判断临时文件是否存在,若不存在,则写入每个线程的开始位置

           c) :开启线程,每个线程会下载一部分数据到本地文件中

     二:在内部类DownloadThread中的修改

     A):run方法中创建记录进度的临时文件.

    RandomAccessFile tempRaf = new RandomAccessFile(tempFile"rws");

     B):根据当前线程的id将指针移动到当前线程的位置读取当前线程已完成的数据

    tempRaf.seek(id * 4);

    C):多个下载进程之间同步,统计所有线程总共完成了多少

    synchronized(BPDownloadTask.this) {

    totalFinish += threadFinish;

    }

    D):计算当前线程起始位置,结束位置,后续同多线程下载.

  • 相关阅读:
    软件包管理
    扩大swap分区
    逻辑卷加密(luks)
    创建一个独立的卷组
    dns视图搭建
    dns服务搭建
    [转]ubuntu错误解决E: Sub-process /usr/bin/dpkg returned an error code (1)
    [转]ubuntu server上网配置
    [转]windows 软链接的建立及删除
    [转]Cygwin的包管理器:apt-cyg
  • 原文地址:https://www.cnblogs.com/android100/p/android-web-down.html
Copyright © 2020-2023  润新知