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

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

概述文章目录#简介#异步任务执行时对应的四个方法:#onPreExecute():#doInBackground(Params...):#onProgressUpdate(Progress...):一次呼叫#onPostExecute(Result):当后台计算结束时,调用UI线程后台,#异步任务的创建:#AsyncTask的创建#简介AsyncTask能够适当地、简单地用

文章目录# 简介# 异步任务执行时对应的四个方法:# onPreExecute():# doInBackground(Params...):# onProgressUpdate(Progress...):一次呼叫# onPostExecute(Result):当后台计算结束时,调用UI线程后台,# 异步任务的创建:# AsyncTask的创建



# 简介

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

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

execute();

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

以上是内存溢出为你收集整理的Android 第三章 第二节 多线程 ( AsyncTask )全部内容,希望文章能够帮你解决Android 第三章 第二节 多线程 ( AsyncTask )所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1062982.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存