Android中使用AsyncTask
今天写作业用到了AnsyncTask,记录一下自己的使用情况
1.Android.os.AsyncTask类
1.AsyncTask类对线程间通讯进行了包装,我们可以使用简单的方式来让后台线程和UI线程通讯。后台线程执行异步操作,并且返回通知UI线程。这和异步执行的任务大概和我们平常所使用的handler差不多,AsyncTask在处理费时任务时性能会更好(使用确实比handler方便许多)。
2. AsyncTask对线程之间的的通讯做了包装,AsyncTask是抽象类,定义了三种泛型类型
public abstract class AsyncTask<Params, Progress, Result>
介绍一下这三个参数:
Params是启动任务是输入参数,与使用handler时发送的data类似。
Progress时任务执行的情况,我们在使用进度条时非常用用。
Result时后台执行任务最终返回的结果。
3.需要用到的四个方法
@Override
protected void onPreExecute() {
super.onPreExecute();
}
这个方法使在执行后台操作前被UI线程调用。可以实现一些组件的简单设置。可以不用实现
doInBackground(Params...)方法是紧跟着上一个方法执行后被执行,运行在后台,不可以操作UI。用来处理耗费时间的操作。通过Params参数我们创建线程实例是传入的参数可以在这里获取。可以通过publishProgress方法传入参数到下一个方法中获取(调用多次会传多个参数,以数组形式存储)。子类必须实现。
onProgressUpdate(Progress...)获取到publishProgress方法传入的参数我们可以用来操作UI组件。
onPostExecute(Result)方法获取在doInBackground(Params...)方法执行完后的返回值可以在界面上通过组件展示给用户。
还有一些方法就不多说了(其实是我没用到,偷个懒。)
4.使用时的注意事项
1) Task的实例必须在UI 线程中创建
2) execute方法必须在UI 线程中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。
4) 该task只能被执行一次,否则多次调用时将会出现异常.参数顺序不能乱
5)参数类型是可以自己定义的
5.实例
>下边是我的一个练习实例。UI界面主要是获取输入的整数计算这个数以前的所有质数然后在界面显示计算进度,同时在完成后展示出来。(代码有点乱呀,不过能看嘻嘻)
- package com.zzu.tangnanxing.a0746;
- import androidx.annotation.NonNull;
- import androidx.appcompat.app.AppCompatActivity;
- import android.app.ProgressDialog;
- import android.content.Context;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.text.TextWatcher;
- import android.view.View;
- import android.widget.Button;
- import android.widget.ImageButton;
- import android.widget.ImageView;
- import android.widget.TextView;
- public class MainActivity extends AppCompatActivity {
- private String string;
- private int count = 0;
- private int[] number;
- private Button btn;
- private TextView textView,textView1;
- private ProgressDialog pd2 = null;
- private int progressStart = 0;
- private int add = 0;
- private Context mContext = null;
- private String factor = 2+",";
- private Handler handler;
- Mytask task;
- private class Mytask extends AsyncTask<String,Integer,String> {
- @Override
- protected void onPreExecute() {
- super.onPreExecute();
- progressStart = 0;
- add = 0;
- //设置属性
- pd2.setMax(100);
- pd2.setTitle("计算"+string+"质数");
- pd2.setMessage("计算中,请稍后...");
- //设置不可以取消关闭进度条
- pd2.setCancelable(false);
- pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- //设置是否显示进度,false显示
- pd2.setIndeterminate(false);
- pd2.show();
- }
- //接受输入的参数、执行任务中的耗时操作、返回线程任务的执行结果
- @Override
- protected String doInBackground(String... strings) {
- //显示进度
- System.out.println(strings[0]);
- //计算质数操作
- for (int i = 1; i <= Integer.valueOf(strings[0]); i++) {
- boolean flag = true;
- if (i == 1 || (i % 2) == 0) {
- } else {
- for (int j = 3; j < i; j += 2) {
- if (i % j == 0) {
- flag = false;
- }
- }
- if (flag) {
- factor = factor+(i+",");
- count++;
- // System.out.println(factor);
- // System.out.println(count);
- }
- }
- progressStart++;
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- publishProgress(progressStart,count);
- }
- //System.out.println(factor);
- return factor;
- }
- @Override
- protected void onProgressUpdate(Integer... values) {
- super.onProgressUpdate(values);
- //System.out.print(progressStart);
- System.out.println(values[0]+" "+values[1]);
- textView1.setText("计算第"+values[1]+"个");
- pd2.setProgress(values[0]/(Integer.valueOf(string)/100));
- if (values[1] >= Integer.valueOf(string)) {
- pd2.dismiss();
- }
- }
- @Override
- protected void onPostExecute(String s) {
- super.onPostExecute(s);
- textView1.append(s);
- pd2.dismiss();
- }
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btn = findViewById(R.id.button);
- textView = findViewById(R.id.textView);
- textView1 = findViewById(R.id.textView1);
- //获取输入内容
- Button Button2 = findViewById(R.id.button2);
- Button2.setOnClickListener(new imageDelete());
- btn.setOnClickListener(new btnClickListener());
- }
- class imageDelete implements View.OnClickListener{
- @Override
- public void onClick(View v) {
- textView.setText("");
- }
- }
- class btnClickListener implements View.OnClickListener{
- @Override
- public void onClick(View v) {
- string = textView.getText().toString();
- if (!string.equals(" ") && string != null){
- //创建mytask
- pd2 = new ProgressDialog(MainActivity.this);
- task = new Mytask();
- task.execute(string);
- // pd2.show();
- //先使用普通方式handler
- // new Thread(){
- // @Override
- // public void run() {
- // super.run();
- // while (progressStart < MAXVALUE){
- // //进度条变化
- // progressStart = 2*usetime();//
- // handler.sendEmptyMessage(111);
- // }
- // }
- // }.start();
- }
- }
- }
- }
Android中使用AsyncTask的更多相关文章
- Android中的AsyncTask异步任务的简单实例
在 Android中的AsyncTask异步任务的简介 一文中.已经对 安卓 异步任务操作做了简单的介绍.这里,直接将上文中的异步任务做了一个实例.实现异步操作更新UI线程,相比开启子线程更新来说逻辑 ...
- 深入了解Android中的AsyncTask
AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程. 我们知道,Androi ...
- Android中使用AsyncTask实现文件下载以及进度更新提示
Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和 ...
- Android 中的AsyncTask
在后台下载图片,下载完成后更新UI是一个很常见的需求.在没有AsyncTask类之前,我们需要写许多thread和Handler的代码去实现这个功能,有了AsyncTask,一切变得简单了.下面摘抄谷 ...
- Android中使用Thread线程与AsyncTask异步任务的区别
最近和几个朋友交流Android开发中的网络下载问题时,谈到了用Thread开启下载线程时会产生的Bug,其实直接用子线程开启下载任务的确是很Low的做法,那么原因究竟如何,而比较高大上的做法是怎样? ...
- 详解Android中AsyncTask的使用
在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...
- 具体解释Android中AsyncTask的使用
在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式须要为每个任务创建一个新的线程,任务完毕后通过Handler实例向UI线程发送消息,完毕界面的更新 ...
- Android中AsyncTask异步
今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...
- Android中AsyncTask的简单用法 .
在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只 ...
随机推荐
- 让debian8.8不休眠,debian设置不休眠模式,因为我的本本休眠了时间不准确了,得重新同步
第一步:sudo vi /etc/systemd/logind.conf /*最好备份下再修改*/ 把下面的参数改为ignoreHandleLidSwitch=ignore 第二步: sudo ser ...
- dsp
- SaltStack事件驱动 – event reactor
Event是SaltStack里面的对每个事件的一个记录,它相比job更加底层,Event能记录更加详细的SaltStack事件,比如Minion服务启动后请求Master签发证书或者证书校验的过程, ...
- GPIO外部中断
来源:莆田SEO 在STM32中,其每一个外设都可以产生中断. 中断分为分为 ①系统异常,内核 ②外部中断,外设 NVIC(Nested Vector Interrupt Controller ):嵌 ...
- 新年在家学java之基础篇-参数&修饰符&构造器
可变参数 不知道可能给方法传递多少个参数时使用这个方法 public void printInfo (String[] args) --可以定义一个数组,在调用这个方法适合赋值给一个数组 public ...
- 50)PHP,单例模式
class B{ ; private static $instance; private function __construct(){} public static function getNew( ...
- left join on注意点
右侧表的条件参数需要放在on后面 where 后面进放置左表的条件参数 比如消息表和用户消息表 消息表里存在类型为<系统消息>的消息是发送给全部用户 我们发送给系统消息时,不直接插入用户消 ...
- 微软不将《帝国时代》终极版上架Steam的原因到底是什么?
毋庸置疑的是,<帝国时代>绝对是一款经典游戏.作为一款RTS名作,在过去的20年时间中<帝国时代>销量超过2000万部.数以千万计的玩家都沉溺于这款游戏中,<帝国时代&g ...
- python+selenium自动化测试之登录
selenium_login.py import unittest from selenium import webdriver class LoginTest(unittest.TestCase): ...
- python或pip'不是内部或外部命令”
Python不是内部外部命令:说明在环境变量中没有添加python的安装文件夹路径 所以我们在path环境变量中添加 E:\python36; Pip不是内部外部命令:说明在环境变量中没有添加pyth ...