安卓除了有Handler类来处理异步消息处理机制,还有另一套异步消息处理机制。我们可以借助AsyncTask类实现异步消息处理。
查看api可以知道AsyncTask是抽象类,我们需要用子类继承它。
实例情景:有一个Button按钮,点击该按钮,相当于是开启了任务。有一个TextView控件,显示进度【从0开始,每过1s,进度值+10,到100,任务停止】
效果如下:
新建:activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.aiden.example.MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改UI" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="当前进度" />
</LinearLayout>
新建MainActivity.java:
package com.example.aiden.example;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements View.OnClickListener {
private Button button;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
button = (Button) this.findViewById(R.id.button);
textView = (TextView) this.findViewById(R.id.textView);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v == button) {
// 调用execute函数,启动任务
new MyAsyncTask().execute();
}
}
// 第一个参数是指执行该MyAsyncTask传入的参数
// 第二个参数是指执行该MyAsyncTask的进度
// 第三个参数是指执行该MyAsyncTask的结果
public class MyAsyncTask extends AsyncTask<Void, Integer, Boolean> {
int percent = 0;
@Override
// 在执行MyAsyncTask前调用
protected void onPreExecute() {
textView.setText("当前进度为:0");
}
@Override
// 后台任务
protected Boolean doInBackground(Void... params) {
try {
while (true) {
percent += 10;
publishProgress(percent);
Thread.sleep(1000);
if (percent >= 100)
break;
}
} catch (Exception e) {
return false;
}
return true;
}
@Override
// 修改UI
protected void onProgressUpdate(Integer... values) {
textView.setText("当前进度为:" + percent);
}
@Override
// 执行MyAsyncTask完毕后返回的结果
protected void onPostExecute(Boolean result) {
if (result)
Toast.makeText(MainActivity.this, "下载完成", Toast.LENGTH_LONG).show();
else
Toast.makeText(MainActivity.this, "下载失败", Toast.LENGTH_LONG).show();
}
}
}
由于代码有详细的注释,可以很好的理解。我们可以把AsyncTask当作是异步消息处理机制【Handler】的封装。