使用AsyncTask实现android后台耗时程序的ProgressDialog提示Demo

一、首先xml文件要这样写

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

<!--    这个控件输入的数据将被送到耗时线程里-->
    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:hint="请在这里输入耗时程序需要传入的参数"
        android:textColor="@color/black"
        android:textColorHint="#505050"
        android:backgroundTint="#505050"/>

<!--    点击这个Button控件上面editText里面的数据将被送入耗时线程-->
    <Button
        android:id="@+id/button"
        android:layout_width="149dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="开始运行"
        android:textColor="#FFFFFF"/>

<!--    后台耗时线程运行完成后将返回数据给这个TextView来显示出来-->
    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal"
        android:textColor="@color/black"/>



</LinearLayout>

二、AsyncTask对象即后台线程方法要这样写

//第一个参数表示执行AsyncTask的时候会传Integer参数给后台任务,第二个参数表示Integer型数据来作为进度显示单位,第三个参数表示使用Integer来反馈执行结果
public class TimeConsumingProgram extends AsyncTask<Integer,Integer,Integer> {
    private ProgressDialog progressDialog;
    private TextView textView;

    public TimeConsumingProgram(ProgressDialog progressDialog, TextView textView){
        this.progressDialog = progressDialog;
        this.textView = textView;
    }

    //这个方法是在后台线程运行前先执行的
    @Override
    protected void onPreExecute() {
        progressDialog.setCanceledOnTouchOutside(false);//让ProgressDialog提醒没有办法被返回
        progressDialog.setMessage("耗时线程运行中");
        progressDialog.show();
    }

    //这个方法里面的方法都是运行在后台程序中的
    @Override
    protected Integer doInBackground(Integer... input) {
        int num = input[0];
        System.out.println("num:" + num);
        //随便写的耗时程序
        for(int i=0; i<num; i++){
            if(i == (num-1)){
                break;
            }
        }
        //耗时程序运行结束返回数据666给onPostExecute方法
        return 666;
    }

    //这个方法里面的程序接收doInBackground后台返回的方法,并可以操控前台UI
    @Override
    protected void onPostExecute(Integer theNumber) {
        progressDialog.dismiss();
        String returned_data = theNumber.toString();
        textView.setText("耗时程序运行结束,且耗时线程返回了数字:" + returned_data);//接收666这个数据,并显示出来。
    }
}

三、主方法要这样写

public class MainActivity extends AppCompatActivity implements  View.OnClickListener{
    private EditText editText;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);
        editText = (EditText) findViewById(R.id.editText);
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
    }

//    注意这里按键重写功能的方法只能是这个,不能用匿名模式的,不然ProgressDialog无法获得context;
//    这个按键重写的功能是:当点击这个按键时,获取editText里面的数字,并转化为Integer格式;
//    接着将这个progressDialog和textView作为参数传入AsyncTask对象timeConsumingProgram;
//    最后调用timeConsumingProgram的execute方法,并传入input参数。
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                String inputString = editText.getText().toString();
                Integer input = Integer.parseInt(inputString);

                ProgressDialog progressDialog = new ProgressDialog(this);//创建一个耗时线程用的ProgressDialog对象
                TimeConsumingProgram timeConsumingProgram = new TimeConsumingProgram(progressDialog,textView);
                timeConsumingProgram.execute(input);
                break;
            default:
                break;
        }
    }


}

四、这样就可以实现以下效果
①输入100000000并点击开始运行
使用AsyncTask实现android后台耗时程序的ProgressDialog提示Demo
②显示以下图片状态
使用AsyncTask实现android后台耗时程序的ProgressDialog提示Demo
③最后得出结果如下图
使用AsyncTask实现android后台耗时程序的ProgressDialog提示Demo

上一篇:删除带头结点的非空单链表中值相同的多余结点


下一篇:关于ProgressDialog按返回键后不执行返回键处理代码的问题