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