• Android基础_1


    1、handler是在UI主线程和其他子线程中间传递数据。

    首先开启应用时,就会进入UI线程。如果同时需要从网络下载文件等其他操作,若直接在主线程中执行,一旦发生阻塞,整个进程就会暂停,界面就没有响应并强制关闭。所以,我们常常新建子线程来完成对应的操作。通过在主线程中运行handler,利用Message对象把子线程得到的数据传递(sendMessage())给主线程使用。

    Message msg = new Message();
    msg.what = SERVER_ERROR;

    msg.setdata();
    handler.sendMessage(msg);

    2、多线程下载 http://www.cnblogs.com/yydcdut/p/3796197.html

    Android客户端要从服务器上下载资源,首先获取资源大小,并在客户端通过RandomAccessFile建立一个相同大小的临时文件;

    选取一定个数的线程来同时下载,并用资源大小除以线程数来获取每个线程下载的文件大小;

    同时开启这几个线程来下载,每个线程下载对应位置的文件。

    image

    // 在客户端本地创建出来一个大小跟服务器端文件大小一样的临时文件
                            RandomAccessFile raf;
                            raf = new RandomAccessFile("/data/data/com.yydcdut.duothread/lala.exe", "rwd");
                            raf.setLength(length);
                            raf.close();

    // 平均每一个线程下载的文件大小
    int blockSize = length / threadCount;
    //同时开启线程下载 threadID、threadCount、startIndex、endIndex

                            for (int threadId = 1; threadId <= threadCount; threadId++) {
                                // 第一个线程下载的开始位置
                                int startIndex = (threadId - 1) * blockSize;
                                int endIndex = threadId * blockSize;
                                if (threadId == threadCount) {
                                    // 最后个线程下载的长度弄得稍微大一点
                                    endIndex = length;
                                }
                                System.out.println("线程:" + threadId + "---下载:" + startIndex + "--->" + endIndex);
                                // 开始下载
                                new DownloadThread(path, threadId, startIndex,
                                        endIndex).start();
                            }
                        }

    实际的下载代码:

    1、建立了一个txt文件,目的就是将下载到哪的数据存进去,如果网断了再下载的话,实现断点下载,那么下次下载就可以从这里读取数据,然后在写入文件,就不需要重头再分配大小下载了。

    例如有threadCount = 3个线程,则建3个txt文件来存数据。1.txt,2.txt,3.txt,依次保存对应threadID的下载内容。

    File tempFile = new File("/data/data/com.yydcdut.duothread/" + threadId + ".txt");
    设置断点,每次下载的开头位置为 startIndex = downloadlenInt;// 修改下载的真实的开始位置 已经下载的长度
    2、下载

    创建对应给定URL的HTTP连接。

     URL请求的类别分为二类,GET与POST请求。二者的区别在于:  

     a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,  

     b:) post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。 

                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
          conn.setRequestMethod("GET");

                    conn.setConnectTimeout(5000);
                    conn.setRequestProperty("Range", "bytes=" + startIndex + "-"+ endIndex);
    获取输入流对象来下载

                    InputStream is = conn.getInputStream();// 设置请求位置,返回是当前位置对应的文件输入流 // 随机写文件的时候从那个位置开始写
                    RandomAccessFile raf = new RandomAccessFile("/data/data/com.yydcdut.duothread/lala.exe","rwd");
                    raf.seek(startIndex);

  • 相关阅读:
    HDU 1847 Good Luck in CET-4 Everybody! (博弈)
    HDU 1242 Rescue (BFS+优先队列)
    POJ 1061 青蛙的约会(扩展欧几里德算法)
    UVa 1610 Party Games(思维)
    hdu 1025LIS思路同1257 二分求LIS
    hdu 1257 LIS (略坑5
    什么是可串行化MVCC
    老板又出难题,气得我写了个自动化软件
    opencv学习一:概述与环境搭建(python3.7+pycharm)
    人工智能能力提升指导总结
  • 原文地址:https://www.cnblogs.com/wingjay/p/3826968.html
Copyright © 2020-2023  润新知