Android中使用AsyncTask
zzu南极星 人气:0>##今天写作业用到了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(); } } } }
加载全部内容