AsyncTask的介绍 --》 多线程
优点:解决了Handle中位置不在一个地方的问题。 使得代码操作或查看简单
缺点:改task只能被执行一次,否则多次调用时将会出现异常
使用步骤:
1.实现一个父类为AsyncTask的类
2.在主线程中创建并调用execute(Params)方法
1.AsyncTask是抽象类。 AsyncTask定义了三种泛型类型 Param, Progress和Result
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
2.doInBackground(Params...)方法是必须要实现。该方法运行在后台线程中。可以通过publishProgress(Progress)方法来更新实时的任务进度
3.onProgressUpdate(Progress...),在publishProgress(Progress)方法被调用后, main thread将调用该方法在界面上展示任务的进展情况
4.onPostExecute(Result).在doInBackground执行完后,主线程会调用该方法,后台执行的Result会传递到改方法中,之后传给UI
5.onCancelled();在主线程通过 TmpAsynTask.onCancelled()调用,取消线程操作。 可以通过isCancelled()判断该函数是否被调用
AsyncTask的使用原则
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。
一个简单的例子,在通过线程修修改界面上的1为2
package com.example.asynctasktest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button btnStart;
private TextView txtDisplay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtDisplay = (TextView) findViewById(R.id.txtDisplay);
btnStart = (Button) findViewById(R.id.btnStart);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new TestAsyncTask().execute(txtDisplay.getText().toString());
}
});
}
private class TestAsyncTask extends AsyncTask<String, Integer, String> {
ProgressDialog dialog;
@Override
protected String doInBackground(String... params) {
publishProgress(0);
String tmpValue = params[0];
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(1);
return String.valueOf(Integer.parseInt(tmpValue) + 1);
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
int tmpValue = values[0];
switch (tmpValue) {
case 0:
dialog = ProgressDialog.show(MainActivity.this, "", "Loading. Please wait...", true);
break;
case 1:
dialog.cancel();
break;
default:
break;
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
txtDisplay.setText(result);
}
}
}