多线程的功能:减少堵塞,
处理机制:
过通知机制通知用户使用的活动(activity);在后台线程中处理耗时的操作
1.新建一个线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
new Thread() { // 创建线程
public void run() {
try {
while (true) {
sleep(1000);
System.out.println(">>>>>>>TISK");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();
|
有三个返回值分别是
传递的数据类型 返回值数据类型
返回结果的数据类型
new AsyncTask<String, Float, String>() {// 初始化数据
方法 doInBackground 主要执行后台的操作,与UI的交互,要交给回调函数
onPostExecute 当执行完doback自动执行,参数为都
doInBackground的返回值
onPreExecute 进行doInBackground方法时,调用的方法 返回值为第三个
onProgressUpdate
执行过程中对外发布执行的的进度 返回值为第二个
一个异步任务的执行一般包括以下几个步骤:
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
public void ReadURL(String url) {
/**
* 当后台运行耗时操作时,主线程ui不受影响..和UI的互动中,要使用下面几个回调方法
*/
new AsyncTask<String, Float, String>() {// 初始化数据 传递的数据类型 返回值数据类型
// 返回结果的数据类型
// 只能涉及和UI没关系的操作
protected String doInBackground(String... argo) { // 执行后台的耗时操作
try {
URL url = new URL(argo[0]); // 从第一个数值读取
URLConnection connection = url.openConnection();
long total = connection.getContentLength();// 获取当前读取对象的全部长度
InputStream iStream = connection.getInputStream();// 获得InputStream对象
InputStreamReader isr = new InputStreamReader(iStream);// 创建InputStreamReader一层层包转起来
BufferedReader br = new BufferedReader(isr);
String line; // 存放的一行信息
StringBuilder builder = new StringBuilder();// 存放连接的数据
while ((line = br.readLine()) != null) {
builder.append(line);
publishProgress((float) builder.toString().length()
/ total);// 获取过程中的百分比进度条
}
System.out.println(builder.toString());
br.close();
iStream.close();
return builder.toString();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
protected void onCancelled() {
super.onCancelled();
}
protected void onCancelled(String result) {
super.onCancelled(result);
}
/**
* 当doInBackground方法结束后,自动调用该方法
*/
protected void onPostExecute(String result) {// result就是doInBackground的返回值
System.err.println(result);
text.setText(result);
super.onPostExecute(result);
}
/**
* 进行doInBackground方法时,调用的方法
*/
protected void onPreExecute() {
Toast.makeText(MainActivity.this, "开始读取", Toast.LENGTH_LONG)
.show();
super.onPreExecute();
}
/**
* 执行过程中对外发布执行的的进度
*/
protected void onProgressUpdate(Float... values) {
System.err.println(values[0]);
super.onProgressUpdate(values);
}
}.execute(url);// 执行方法 传入的参数
}
|