Android之AsyncTask学习

    xiaoxiao2022-06-30  95

    1) HandlerAsyncTask存在的原因

    主要的原因就是为了不阻塞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()方法执行完成后返回的结果。

    转载请注明原文地址: https://ju.6miu.com/read-1126232.html

    最新回复(0)