1) Handler和AsyncTask存在的原因
主要的原因就是为了不阻塞UI线程,且UI的更新只能在主线程(UI线程)中完成的,所以异步处理是必须的。
2) 进度条项目实现简单的异步线程操作
==>配置文件
<?xml version="1.0"
encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/textView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<ProgressBar
android:id="@+id/progressBar02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"/>
<Button
android:id="@+id/button03"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="进度条"
/>
</LinearLayout>
在配置文件中,主要是<ProgressBar>控件的使用,该控件就是Android系统自带的进度条组件。
==>MyAsyncTask.java类实现自定义AsyncTask
public class
MyAsyncTask extends
AsyncTask<Integer,Integer,String> {
private TextView
txt;
private ProgressBar
progressBar;
/**
在构造方法中,我们首先要明确,这个MyAsyncTask类主要是用来干什么的,是用来异步实现进度条效果,所以必须要从外部传入要操作的进度条ProgressBar对象,这是必须的,而这里传入的TextView对象不是必须的,只是起到测试效果。
**/
public MyAsyncTask(TextView txt, ProgressBar progressBar) {
super();
this.txt
= txt;
this.progressBar
= progressBar;
}
/**
@Override //主要执行的是耗时较长,放在后台进行操作的任务(在后台线程执行),首先这是在后台操作的,也就是和主线程没有一点关系,关键是这里方法的参数(泛型)、publishProgress(int)方法和return返回值三点,
1)doInBackground(Integer... params)这里的参数就是在MyAsyncTask对象执行excute(Intefer... params);传进去的,也就是在主线程中传过来的。MyAsyncTask
myAsyncTask=new MyAsyncTask(textView01,progressBar02);
myAsyncTask.execute(100,100,100);
2)publishProgress(int)方法,该方法是在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行。
3)return返回值 的结果就是在doInBackground()方法执行完成后的结果。
**/
protected
String doInBackground(Integer... params) {
int i=0;
for(i=10;i<=100;i+=10){
//线程休眠
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
publishProgress(i);
}
return i + params[0].intValue() +
"";
}
1. /**
@Override * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)
2. * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置
**/
protected void
onPostExecute(String s) {
super.onPostExecute(s);
txt.setText("异步线程执行结束"+s);
}
/**
@Override //进度条效果(在主线程显示)
1. * 这里的Intege参数对应AsyncTask中的第二个参数
2. * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行
3. * onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作
**/
protected void
onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int value=values[0];
progressBar.setProgress(value);
}
@Override //这里是任务执行之前执行,,该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置
protected void
onPreExecute() {
super.onPreExecute();
txt.setText("开始执行异步线程");
}
@Override //用户取消操作
protected void
onCancelled() {
super.onCancelled();
}
}
3) UI线程调用
button03.setOnClickListener(new
View.OnClickListener() {
@Override
public void
onClick(View v) {
MyAsyncTask myAsyncTask=new
MyAsyncTask(textView01,progressBar02);
myAsyncTask.execute(100,100,100);
}
});
注意点:
· Task的实例必须在UI thread中创建;
· execute方法必须在UI thread中调用;
· 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
· 该task只能被执行一次,否则多次调用时将会出现异常;
· myAsyncTask.execute(100,100,100); 表示的执行,里面存放的是泛型参数,就是doInBackground()方法执行完成后返回的结果。