AsyncTask
AsyncTask简介
前言
多线程的应用经常出现在Android开发中,常用方法主要有:继承Thread类、实现Runnable接口、Handler以及HandlerThread、还有轻量级的AsyncTask。
定义及作用、使用要点
AsyncTask是抽象类,使用时需要实现子类。可以实现多线程,异步通信进行消息传递,实现了主线程和工作线程之间的通信:把执行结果传递给UI线程。实现起来相对简单,而且节省一部分资源。
public abstract class AsyncTask<Params, Progress, Result> { ... }
类中参数为3种泛型类型 整体作用:控制AsyncTask子类执行线程任务时各个阶段的返回类型 具体说明: a. Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数 b. Progress:异步任务执行过程中,返回下载进度值的类型 c. Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致 注解: a. 使用时并不是所有类型都被使用 b. 若无被使用,可用java.lang.Void类型代替 c. 若有不同业务,需额外再写1个AsyncTask的子类,一个子类不可以使用两次 d. AsyncTask实例必须在UI线程中创建 e. execute方法必须在UlThread中调用 f. AsyncTask不能完全代替线程
使用步骤
- 创建
AsyncTask
子类 & 根据需求实现核心方法 - 创建
AsyncTask
子类的实例对象(即 任务实例) - 手动调用
execute(()
从而执行异步线程任务
质数作业例子
import androidx.appcompat.app.AppCompatActivity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private Button btn; private ProgressDialog pd; private MyTask myTask; private TextView textView; private EditText editText; private int progress = 0; private String str = ""; private int total; private Long param; private int num = 0; private int j; private boolean sgin; //计算n个数以内质数的个数 public int isPrime(Long n){ for (int i = 2; i <= n; i++) { if(i % 2 == 0 && i != 2 ) continue; //偶数和1排除 sgin = true; for (j = 2; j <= i/2 ; j++) { if (i % j == 0) { sgin= false; break; } } if (sgin) { num++; } } return num; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myTask = new MyTask(); textView = findViewById(R.id.textView); editText = findViewById(R.id.editText); btn = findViewById(R.id.button); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //需要放在点击处理事件之后进行获取,因为涉及到转换,不可为空。 param = Long.parseLong(editText.getText().toString()); myTask.execute(); } }); } //内部类 class MyTask extends AsyncTask<Integer, Integer, String> { /* 1.onPreExecute() 作用:在execute(Params... params)被调用后立即执行, 一般用来在执行后台任务前对UI做一些标记。 比如在执行线程任务之前显示进度条对话框。如下。 注解:不是必要复写的方法 */ @Override protected void onPreExecute() { super.onPreExecute(); pd = new ProgressDialog(MainActivity.this); pd.setMax(100); pd.setTitle("任务正在执行中"); pd.setMessage("任务正在执行中,敬请等待..."); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.show(); } /* 2.doInBackground() 作用:在onPreExecute()完成后立即执行,用于在后台线程执行较为费时的操作, 此方法将接收输入参数和返回计算结果。返回值由onProgress()接收。 在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。 publishProgress(Progress... values)执行过后立即执行onProgressUpdate(Progress... values)。 注解:一定要复写此方法。 */ @Override protected String doInBackground(Integer... integers) { total = isPrime(param); for (int i = 2; i <= param; i++) { if(i % 2 == 0 && i != 2 ) continue; //偶数和1排除 sgin = true; for (j = 2; j <= i/2 ; j++) { if (i % j == 0) { sgin= false; break; } } if (sgin) { progress++; str += i+", "; try { Thread.sleep(100); /* deal:当前计算出的质数个数占总数的比例 问题:int类型相除会失掉精度,即小数点之后的数字会被去掉 解决:将整数其中一个强制转换成浮点数,再与另一个整数相除。 */ double m = (progress*1.0/total)*100; //更新进度(此处参数必须得是int类型) publishProgress((int)m); } catch (InterruptedException e) { e.printStackTrace(); } } } return str; } /* 3.onProgressUpdate() 作用:publishProgress(Progress... values)执行过后立即执行onProgressUpdate(Progress... values)。 更新进度信息到UI组件上【已完成...】。 注解:不强制复写 */ @Override protected void onProgressUpdate(Integer... values) { //实时更新进度条进度的数值 pd.setProgress(values[0]); textView.setText("已计算出【"+progress+"】个!"); super.onProgressUpdate(values); } /* 4.onPostExecute() 作用:接收doInBackground()线程执行结果,并更新到UI组件 注解:一定要复写 */ @Override protected void onPostExecute(String s) { super.onPostExecute(s); //计算完成,关闭弹窗 pd.dismiss(); //把结果交给主线程显示在UI组件上 textView.setText(s); } } }
运行结果:
问题整理
1.求质数的算法
https://www.cnblogs.com/javaLin/p/11315662.html
2.内部类
https://www.cnblogs.com/moris5013/p/10684623.html
https://www.jianshu.com/p/4e256b63d022
3.整数相除
https://www.cnblogs.com/xiaoli3007/p/4335141.html
参考:
https://blog.csdn.net/carson_ho/article/details/79314326
https://www.cnblogs.com/lgk1002/p/6134061.html
https://blog.csdn.net/sinat_31057219/article/details/54096136