AsyncTask
- 继承AsyncTask
三个参数:Params外界传递进来的,不要传递则设为Void
Progress 执行进度,边完成边传,子线程执行的百分比
Result返回参数,执行完成时返回
重写方法:doInBackground(有返回值,并且返回值是由result参数决定的,参数列表首先是一个可变参数,是由params参数决定的) - 实现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();
}