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()方法执行完成后返回的结果。