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