ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-05-14 22:03:01  阅读:238  来源: 互联网

标签:ProgressDialog Demo 耗时 AsyncTask input Integer android progressDialog textView


一、首先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并点击开始运行
在这里插入图片描述
②显示以下图片状态
在这里插入图片描述
③最后得出结果如下图
在这里插入图片描述

标签:ProgressDialog,Demo,耗时,AsyncTask,input,Integer,android,progressDialog,textView
来源: https://blog.csdn.net/X_tuan_tuan/article/details/116807696

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有