异步加载和多线程下载

AsyncTask

  1. 继承AsyncTask
    三个参数:Params外界传递进来的,不要传递则设为Void
    Progress 执行进度,边完成边传,子线程执行的百分比
    Result返回参数,执行完成时返回
    重写方法:doInBackground(有返回值,并且返回值是由result参数决定的,参数列表首先是一个可变参数,是由params参数决定的)
  2. 实现AsynTask中定义的一个或几个方法
    onPreExecute(在执行实际的后台操作前,被UI线程调用,可以在在该方法中做一些准备工作,可以不用实现)
    doInBackground(在onPreExucute方法执行后马上执行,该方法在后台线程中,主要负责执行那些耗时的后台处理工作,跟之前写的子线程的方法一样,该方法是抽象方法子类必须实现
    onProgressUpdate:没返回值,参数由progress决定,不会主动回调,而是需要publishProgress(在doInBackground中调用该方法)去间接调用,在界面上展示任务的进展情况,例如通过一个进度进行展示,跟之前写的Handler一样
    onPostExecute:他的参数是由doInBackground中返回的值。

使用:实例,然后在主线程调用excute(params),它会先调用onPreExecute(),之后启动新线程,调用doInBackground方法进行异步处理,在里面调用
Task实例必须在UI线程中使用,excute()必须在UI主线程,中调用

  • 实例——execute(params)-doInBackground参数
  • Progress-publishProgress的参数-onProgressUpdate的参数
  • result——doInbackground返回值-onPostExecute的参数

多线程下载

问题:
怎么在一个文件里面写数据的时候按照指定位置写
如何获取要下载文件的大小(length)
怎么计算每个子线程的下载区间(length/threadCount)

RandomAccessFile raf = new RandomAccessFile(file, "rwd");
raf.setLength(length);// 先占用储存位置大小
raf.close();

写个类继承Thread。raf.seek(startIndex);

private int startIndex;
private int endIndex;
private String path;
private int threadID;

public DownThread(int startIndex, int endIndex, String path,int threadID) {
    this.startIndex = startIndex;
    this.endIndex = endIndex;
    this.path = path;
    this.threadID=threadID;
}

@Override
public void run() {
    try {
        URL url = new URL(path);
        HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();
        connection.setRequestMethod("GET");
        connection.setConnectTimeout(8000);
        connection.setReadTimeout(8000);
        connection.setRequestProperty("Range", "bytes=" + startIndex + "-"
                + endIndex);// 拿到中间一小段输入流
        //这个时候就是206
        if (connection.getResponseCode() == 206) {
            InputStream inputStream = connection.getInputStream();
            File file = new File("ZHONGTIANSHENG - IF YOU.mp3");
            RandomAccessFile raf = new RandomAccessFile(file, "rwd");
            raf.seek(startIndex);
            byte[] b=new byte[1024];
            int len=0;
            int total = 0;
            while (((len=inputStream.read(b))!=-1)) {
                raf.write(b, 0, len);
                total+=len;
                System.out.println("第"+threadID+"条线程下载了"+total);
            }
            raf.close();
            inputStream.close();
            System.out.println("第"+threadID+"条线程下载结束了");

        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    super.run();
}

你可能感兴趣的:(异步加载和多线程下载)