Android 第三章 第二节 多线程 ( AsyncTask )



# 简介

AsyncTask能够适当地、简单地用于UI线程,这个类准许执行后台操作。
异步任务的定义是一个在后台线程上运行,其结果是在UI线程上显示的一种类。

还是会创建线程的,不过是封装了起来,看不到罢了。

在这里插入图片描述

execute();

启动异步任务的方法(子线程)

# 异步任务执行时对应的四个方法:

# onPreExecute():
多用于初始化
任务被执行之前调用UI线程。
• 这步通常被用于设置任务,例如在用户界面显示一个进度条。
# doInBackground(Params…):
在子线程中执行(后台中执行操作)
onPreExecute()执行完成,立刻调用后台线程。
###   线程名称是  AsyncTask #1   自动定义的   ###
• 这步被用于执行较长时间的后台任务;
• 异步任务的参数也被传到这步;
• 计算的结果在这步返回,将传回到上一步
# onProgressUpdate(Progress…):一次呼叫
###   唯一不能自动调用的方法   ###
需要调用另外一个方法,就是下面的那个方法。
publishProgress(Progress...)后调用UI线程,执行的时机没有定义。
• 这个方法用于在用户界面显示进度,当后台计算还在进行时。
• 例如:这个方法可以被用于一个进度条动画或在文本域显示日志。
# onPostExecute(Result):当后台计算结束时,调用UI线程后台,
计算结果作为一个参数传递到此方法中。

四大方法的使用


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //启动异步任务
        MyAsyncTask myAsyncTask=new MyAsyncTask();
        myAsyncTask.execute();
    }//-------------------------------------onCreate

    //定义异步任务类,继承自AsyncTask(抽象类)类
    private class MyAsyncTask extends AsyncTask{

        @Override
        protected void onPreExecute() {
            Log.e("onPreExecute","线程名城为:"+Thread.currentThread().getName());
            super.onPreExecute();
        }

        @Override//四个方法中必须重写的方法,其他方法可以选择实现------/-/-/-/-/-/-/-/-/-/-/-/
        protected Object doInBackground(Object[] objects) {
            Log.e("doInBackground","线程名城为:"+Thread.currentThread().getName());

            //执行四大方法之一的onProgressUpdate方法
            publishProgress();
            return null;
        }

        @Override//只有这个方法需要手动调用,在四大方法之一的doInBackground中调用
        protected void onProgressUpdate(Object[] values) {
            Log.e("onProgressUpdate","线程名城为:"+Thread.currentThread().getName());
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(Object o) {
            Log.e("onPostExecute","线程名城为:"+Thread.currentThread().getName());
            super.onPostExecute(o);
        }
    }//------------------------------------AsyncTaks
}//--------------------------------------MainActivity





结果是:
 E/onPreExecute: 线程名城为:main
 E/doInBackground: 线程名城为:AsyncTask #1------自动命名的
 E/onProgressUpdate: 线程名城为:main
 E/onPostExecute: 线程名城为:main




进度条操作的实现


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    
    <!--
       进度条的实现,默认样式是圆形,通过style可改变形状
     -->
    <ProgressBar
        android:id="@+id/activity_main_progressbar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    />
    
</LinearLayout>










public class MainActivity extends AppCompatActivity {

    //实现进度条
    private ProgressBar progressBar1; 		进度条id
    private int jindu;				  		自定义的整数,表示进度


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar1=findViewById(R.id.activity_main_progressbar1);		//绑定id
        //初始化进度条
        progressBar1.setMax(100);


        //启动异步任务
        MyAsyncTask myAsyncTask=new MyAsyncTask();
        myAsyncTask.execute();


    }//--------------------------------------------------------------------------------onCreate


    //定义异步任务类,继承自AsyncTask(抽象类)类
    private class MyAsyncTask extends AsyncTask{
        @Override//四个方法中必须重写的方法,其他方法可以选择实现------/-/-/-/-/-/-/-/-/-/-/-/
        protected Object doInBackground(Object[] objects) {
            //线程等待
            while(true){
                try{
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }//执行四大方法之一的onProgressUpdate方法

                if(jindu==80){//进度100的时候跳出
                    break;
                }
                publishProgress();
            }
            return null;
        }


        @Override//只有这个方法需要手动调用,在四大方法之一的doInBackground中调用
        protected void onProgressUpdate(Object[] values) {

            jindu=progressBar1.getProgress();//int型jindu==进度条id的get方法。
            progressBar1.setProgress(jindu+20);//进度条+20

            super.onProgressUpdate(values);
            Log.e("1111111111111111111",jindu+"");
        }

    }//------------------------------------------------------------------AsyncTaks
}//------------------------------------------------------------------------------------MainActivity


# 异步任务的创建:

  • AsyncTask必须被子类继承。
    • 子类至少重写其中的doInBackground(Params…)方法,一般还会重写onPostExecute(Result)。

  • 任务实例必须创建在UI线程。

  • execute(Prams…)必须在UI线程上调用。

  • 不要手动调用onPreExecute(), onPostExecute(),
    doInBackground(), onProgressUpdate()。

  • 不能在doInBackground(Params… params)中更改UI界面。

# AsyncTask的创建

• 异步任务中的三个泛型:
- Params:任务执行器需要的数据类型。
- Progress:后台计算中使用的进度单位数据类型。
- Result:后台计算返回结果的数据类型。
上一个基础上实现了泛型的应用
方法细讲,参数的传递与类型





public class MainActivity extends AppCompatActivity {

    //实现进度条
    private ProgressBar progressBar1;
    private int jindu;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBar1=findViewById(R.id.activity_main_progressbar1);
        //初始化进度条
        progressBar1.setMax(100);


        //启动异步任务
        MyAsyncTask myAsyncTask=new MyAsyncTask();
        //myAsyncTask.execute();
        myAsyncTask.execute("自定义参数,访问的网络地址");//参数的值会传入doInBackgroud方法


    }//--------------------------------------------------------------------------------onCreate


    //定义异步任务类,继承自AsyncTask(抽象类)类
    //如果不指定泛型类型的话,方法中所有形参与返回值类型都是object
    private class MyAsyncTask extends AsyncTask<String, Integer, String>{
        //用了泛型,下面的方法的参数也需要相应的变换

------------------------------------------------
        @Override//四个方法中必须重写的方法,其他方法可以选择实现------/-/-/-/-/-/-/-/-/-/-/-/
        protected String doInBackground(String[] objects) {
            Log.e("主线程传递的数据",objects[0]);//参数放入了数组里面
            //线程等待
            while(true){
                try{
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }//执行四大方法之一的onProgressUpdate方法

                if(jindu==80){//进度100的时候跳出
                    break;
                }
                publishProgress(20);//可以没有参数,有参数的话,参数会出现在onProgressUpdate方法参数的values【0】位置
            }
            //            publishProgress();//会执行onProgressUpdate方法
            //return的参数会传入onPostExecute方法中
            return "doInBackground执行的结果";
        }

------------------------------------------------
        @Override//只有这个方法需要手动调用,在四大方法之一的doInBackground中调用
        protected void onProgressUpdate(Integer[] values) {

            jindu=progressBar1.getProgress();//int型jindu==进度条id的get方法。
            progressBar1.setProgress(jindu+20);//进度条+20

            super.onProgressUpdate(values);
            Log.e("1111111111111111111",jindu+"");
            Log.e("onProgressUpdate参数的值",values[0] + "");

        }
------------------------------------------------
        @Override
        protected void onPostExecute(String o) {
            Log.e("onPostExecute参数的值",o);//o是doInBackgroud方法的返回值
            super.onPostExecute(o);
        }
    }//------------------------------------------------------------------AsyncTaks
}//------------------------------------------------------------------------------------MainActivity

猜你喜欢

转载自blog.csdn.net/qq_44627608/article/details/106032014