原创 Android之AsyncTask使用实例

2021-11-12 16:33 2320 22 3 分类: 软件与OS 文集: android studio

AsyncTask Android提供的轻量级的异步类,可以直接继承 AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给 UI主线程。这个类的设计目的很明确,就是为了"执行一个较为耗时的异步任务(最多几秒钟),然后更新界面"

这种需求本可以使用Handler Thread 来实现,但是在单个后台异步处理时显得代码过多、结构过于复杂,因此 Android 提供了AsyncTask类。但是在使用多个后台异步操作并需要进行UI变更时,使用AsyncTask类就变得复杂起来,使用Handler Thread则更加合适。

另外,这里所说的轻量级只是代码上的轻量级,而非性能上的,使用 AsyncTask 会更加消耗性能

AymcTask类有4个重要方法,这也是当一个异步任务被执行时要经历的4步,如表1-1 

1-1 AsyncTask类的4个重要方法

方法

作用

onPreExecute()

在异步任务开始执行前在 UI线程中执行,一般用来设置任务参数

dolnBackground()

 

最重要的方法,在子线程中执行(事实上,只有它在子线程中执行,其他方法都在UI线程中执行)。当onPreExecute()结束后,本方法立刻执行,用来进行后台的耗时计算异步任务的参数会被传给它,执行完成的结果会被送给第四步。执行途中,它还可以调用 publishProgress()方法来通知 UI线程当前执行的进度

 

onProgressUpdate()

publishProgress()被调用后,它在 UI线程中执行,刷新任务进度,一般用来刷新进度条等 UI部件

onPostExecute()

 

当后台的异步任务完成后,它会在UI线程中被调用,并获取异步任务执行完成的结

下面用一个实例来讲解如何使用 AsyncTask 类。创建一个继承自 AsyncTask 类的MyAsyncTask类,实现它的4个主要方法,并创建一个带参数的构造方法,用以介绍Activity类的Content 和布局管理器。在 dolnBackground()方法中模拟下载任务,并每隔1秒更新一次进度条。代码如下

  1. package com.rfstar.asynctasktest;
  2. import android.app.ProgressDialog;
  3. import android.content.Context;
  4. import android.os.AsyncTask;
  5. import android.view.ViewGroup;
  6. import android.widget.ProgressBar;
  7. import android.widget.TextView;
  8. public class MyAsyncTask extends AsyncTask {
  9. private ProgressDialog progressDialog;
  10. private ViewGroup viewGroup;
  11. private Context context;
  12. public MyAsyncTask(Context context,ViewGroup viewGroup)
  13. {
  14. this.viewGroup=viewGroup;
  15. this.context=context;
  16. }
  17. @Override
  18. protected void onPreExecute()
  19. {
  20. super.onPreExecute();
  21. //使用一个进度条对话框;
  22. progressDialog=new ProgressDialog(context);
  23. progressDialog.setTitle("正在下载中,请稍后......");
  24. //设置ProgressDialog样式为圆圈的形式
  25. progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  26. progressDialog.show();
  27. }
  28. @Override
  29. protected String doInBackground(Object[] params)
  30. {
  31. //execute()方法传递的参数
  32. String address=(String)params[0];
  33. int flag=0;
  34. while (flag<100){
  35. flag+=20;
  36. //跟新进度,将回调onProgressUpdate()方法
  37. publishProgress(flag);
  38. try{
  39. Thread.sleep(1000);
  40. }catch (Exception e){
  41. }
  42. }
  43. return address+"从这个下载地址下载了一本小说,欢迎阅读。";
  44. }
  45. @Override
  46. protected void onProgressUpdate(Object[] values){
  47. super.onProgressUpdate(values);
  48. //跟新进度条
  49. progressDialog.setProgress((Integer)values[0]);
  50. }
  51. @Override
  52. protected void onPostExecute(Object o){
  53. super.onPostExecute(o);
  54. //在布局中加入一个TextView
  55. TextView textView=new TextView(context);
  56. textView.setText((String)o);
  57. viewGroup.addView(textView);
  58. //关闭进度条
  59. progressDialog.dismiss();
  60. }
  61. }

同时建立一个Activity,在布局文件中加入一个Button,当点击Button时,实例化MyAsyncTask类并调用excute()方法。布局文件代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. android:id="@+id/line"
  8. tools:context=".MainActivity">
  9. <Button
  10. android:id="@+id/download_btn"
  11. android:layout_width="match_parent"
  12. android:layout_height="wrap_content"
  13. android:text="点击下载"/>
  14. </LinearLayout>

MainActivity的代码如下:

  1. package com.rfstar.asynctasktest;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.app.ProgressDialog;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.widget.Button;
  7. import android.widget.LinearLayout;
  8. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  9. private Button downloadbutton;
  10. private ProgressDialog progressDialog;
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. initView();
  16. }
  17. private void initView() {
  18. downloadbutton=(Button)findViewById(R.id.download_btn);
  19. downloadbutton.setOnClickListener(this);
  20. }
  21. @Override
  22. public void onClick(View view) {
  23. MyAsyncTask myAsyncTask=new MyAsyncTask(this,(LinearLayout)findViewById(R.id.line));
  24. myAsyncTask.execute("小说下载地址:");
  25. }
  26. }

运行程序并点击“下载”按钮,将出现一个提示下载的进度条,如图1-1所示。

当完成下载之后,UI界面中会显示刚才模拟下载的文本,效果如图1-2所示。

1-1点击下载并使用progressDialog来显示下载进度

1-2将下载的内容传递到UI线程并显示

android studio工具及手机模拟器以及更多工程源代码下载请前往微信公众号:大鸟科创空间,回复:android studio即可获取。


作者: 大鸟科创空间, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3949041.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
22
关闭 站长推荐上一条 /2 下一条