android基础---AsyncTask, 后台执行任务并同步更新前端UI

AsyncTask是Android中用于在后台执行任务并同步更新UI的工具。它包含三个泛型参数,分别对应输入参数、中间更新UI的参数和最终结果参数。在执行过程中,onPreExecute方法用于初始化,如显示进度条;doInBackground执行后台任务,onProgressUpdate更新UI;完成后,onPostExecute在主线程中运行,更新UI或处理结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AsyncTask为我们提供了一个在后台执行耗时的操作并同步更新UI的方法.

AsyncTask中有三个参数:

      class MyAsyncTask extends AsyncTask<参数1,参数2,参数3>{}

  • 参数1:向后台任务的执行方法传递参数的类型
  • 参数2:在后台任务执行过程中,要求主UI线程处理中间状态,通常是一些UI处理中传递的参数类型
  • 参数3:后台任务执行完返回时的参数类型

      其中参数1和参数2是一个varags,例如String…,相当于String[].


我们可以在主程序中生成一个AsyncTask并执行execute方法启动AsyncTask:

@Override
	protected void onCreate(Bundle savedInstanceState)
	{		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView = (TextView)findViewById(R.id.myText);

                //等待3秒, 然后执行AsyncTask更新界面TextView
                SystemClock.sleep(3000);
 
                //MyAsyncTask是我在下面定义的AsyncTask的子类
                new MyAsyncTask().execute();
	}
注意AsyncTask只能被执行一次, 如果执行第二次, 会抛出错误.


下面给出一个简单的MyAsyncTask:

private class MyAsyncTask extends AsyncTask<Void, String, Void>
	{
		@Override
                //参数类型是AsyncTask<>的第一个参数
		protected Void doInBackground(Void...params)
		{
			String text = "hello world";

                        //把text传递给onProgressUpdate
                        //参数类型是AsyncTask<>的第二个参数
                        publishProgress(text);

                        //可以看到这段代码是在后台线程中执行的

                        System.out.println(Thread.currentThread().getName());
                          
                        //返回值传递给onPostExecute
                        //参数类型是AsyncTask的第三个参数
                        return null;
                }
                   
              @Override
                //参数类型是AsyncTask<>的第二个参数
                protected void onProgressUpdate(String...text)
		{

                        //更改UI
                        textView.setText(text[0]);}@Override
                        //参数类型是AsyncTask<>的第三个参数
                }
               
                @Override
                //参数类型是AsyncTask<>的第三个参数
                protected void onPostExecute(Void result)
                {
                        //当doInBackground完成后执行 
                        Toast.makeText(MainActivity.this, "AsyncTask Completed", Toast.LENGTH_LONG).show();
                }
       } 

doInBackground ------ 在主程序中执行execute方法时将执行此方法, 此方法在后台线程中执行, 所以不能在这个方法里执行UI操作. UI操作只能在主线程中执行的.  这个方法的参数类型是AsyncTask<>的第一个参数,返回类型AsyncTask<>的第三个参数


onProgressUpdate ------ 这个方法在主线程中执行,  所以可以用来执行UI操作. 而且这个方法接收publishProgress传递的参数, 通常在doInBackground中执行publishProgress方法传递后台执行的结果数据, 然后由onProgressUpdate更新UI, 以此实现同步更新UI. 这个方法以及publishProgress的参数类型是AsyncTask<>的第二个参数.


onPostExecute ------- 这个方法在doInBackground执行完后执行, doInBackground的返回值会传递进来. 这个方法也是在主线程中执行, 所以可以在AsyncTask完成时, 用来执行更新UI的操作


onPreExecute ------- 这个方法是在doInBackground执行之前调用的, 在主线程中执行. 可以用来在UI界面设置一个progress bar显示后台任务的执行进度.


PS: AsyncTask中的参数都是范式的书写方式.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值