今天写作业用到了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的更多相关文章

  1. Android中的AsyncTask异步任务的简单实例

    在 Android中的AsyncTask异步任务的简介 一文中.已经对 安卓 异步任务操作做了简单的介绍.这里,直接将上文中的异步任务做了一个实例.实现异步操作更新UI线程,相比开启子线程更新来说逻辑 ...

  2. 深入了解Android中的AsyncTask

    AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程.  我们知道,Androi ...

  3. Android中使用AsyncTask实现文件下载以及进度更新提示

    Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和 ...

  4. Android 中的AsyncTask

    在后台下载图片,下载完成后更新UI是一个很常见的需求.在没有AsyncTask类之前,我们需要写许多thread和Handler的代码去实现这个功能,有了AsyncTask,一切变得简单了.下面摘抄谷 ...

  5. Android中使用Thread线程与AsyncTask异步任务的区别

    最近和几个朋友交流Android开发中的网络下载问题时,谈到了用Thread开启下载线程时会产生的Bug,其实直接用子线程开启下载任务的确是很Low的做法,那么原因究竟如何,而比较高大上的做法是怎样? ...

  6. 详解Android中AsyncTask的使用

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...

  7. 具体解释Android中AsyncTask的使用

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式须要为每个任务创建一个新的线程,任务完毕后通过Handler实例向UI线程发送消息,完毕界面的更新 ...

  8. Android中AsyncTask异步

    今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...

  9. Android中AsyncTask的简单用法 .

    在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只 ...

随机推荐

  1. 【2】从零认识中心极限思想-e往无尽

    目录 e往无尽 单调性.有界性 \(e^{-x^2}\)的积分性质 函数列的近似 傅里叶的方案 三角函数系的正交性 傅立叶展开 傅立叶展开式的指数形式 e往无尽 无论是学高数,还是学习数分,我们在讲到 ...

  2. Xshell便捷设置实现linux复制粘贴

    说明:在window系统中,Ctrl+C是复制的快捷键,Ctrl+V是粘贴的快捷键,但在xshell中,Ctrl+C 代表着中断当前指令. 解决办法如下: 1.  使用xshell中的复制粘贴快捷键复 ...

  3. tesseract系列(2) -- tesseract的使用

    上文说了怎么编译成库,这次说说怎么使用,先验证下编译出来的结果. 下图是debug生成的文件,里面有个tesseract的应用程序. cmd进入目录下,执行命令:tesseract eurotext. ...

  4. Web 手工测试

    day 1 学习目标: 熟练搭建本地测试环境 掌握熟悉项目的步骤和内容 掌握项目基本的测试流程 基础环境介绍: 项目环境的组成部分: 操作系统 windows win7 win10 Linux Cen ...

  5. mac环境下创建bash_profile文件并写入内容 更改php环境变量

    1. 启动终端Terminal 2. 进入当前用户的home目录 输入cd ~ 3. 创建.bash_profile 输入touch .bash_profile 4. 编辑.bash_profile文 ...

  6. day37-进程-锁和信号量

    #1.锁:房间的门上有一把锁,锁上有一把钥匙,一个人使用这把钥匙开锁之后,带上钥匙进入房间,把门给反锁了,他在房间干活, # 只要他不出来还锁,别人是无法进入房间的.同时只能有一个人在房间里干活.效率 ...

  7. linux 上安装 java

    一.源码安装 1.本地下载 java, 并上传到 linux 上 2.解压文件  tar -zxvf jdk-7u72-linux-i586.gz 3.配置环境变量  vi /etc/profile ...

  8. linux清除cache的方法

    1  Linux下内存占用多的原因 当linux第一次读取一个文件运行时,一份放到一片内存中cache起来,另一份放入运行程序的内存中,正常运行,当程序运行完,关闭了,cache中的那一分却没有释放, ...

  9. EXAM-2018-8-9

    EXAM-2018-8-9 B 水题 注意理解题意 有坑 G 博弈 观察发现 总是会进行到最后两个,或者先手取完全部,再特判一下只有一张牌的情况 H 九连环 通过找规律 我们可以得出递推式: F[n] ...

  10. arduino basic issue

    1.    string char Str1[15]; char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; char Str3[8] = {'a', ...