AsyncTask定义:AsyncTask能够使我们更正确和更容易去操作UI Thread,能够使我们在不使用多线程和Handlers的情况下执行后台操作并把执行的结果反馈给UI Thread.
根据AsyncTask的定义有两大显著的好处:1、能够使用AsyncTask异步执行一些耗时的任务,并且能够非常好的和UI Thread交互 2、避免了因使用多线程带来的性能问题和使用Handlers时的繁琐
我们来认识下AsyncTask主要的几个方法
execute(Params....):执行任务,此方法必须运行在UI Thread中,这一点需要大家格外注意下
onPreExecute():这个方法是Task executed时立刻调用但依然是运行在UI Thread中所以不应执行耗时操作,一般是进行Task常规设置工作
doInBackground(Params...)
:onPreExecute()方法完成后立刻执行此方法,该方法是在后台线程中执行(background thread),我们可以进行一些耗时的工作,参数是excute(params....)方法传递而来,可以在此方法中更新一些需要实时UI
publishProgress(Params...):我们可以在doInBackground()方法中使用此方法更新UI
onProgressUpdate(Params...):publishProgress(Params...)调用后执行,运行在UI Thread中,可以在此方法中真正进行UI更新
onPostExecute(Result)
:doInBackground(Params...)方法执行完毕也就是后台线程执行完毕后执行,接收最终执行结果
下面来看一个非常简单的例子
AsyncTaskTestActivity.java
package bing.asyncTask;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
public class AsyncTaskTestActivity extends Activity {
private View db;
private TextView showText;
private ProgressBar pb;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
db = findViewById(R.id.db) ;
showText = (TextView)findViewById(R.id.showText) ;
pb = (ProgressBar)findViewById(R.id.pb) ;
db.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DownloadAt da = new DownloadAt() ;
da.execute(500) ;
}
});
}
class DownloadAt extends AsyncTask{
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Object doInBackground(Object... params) {
for (int i = 0; i <= 100; i++) {
publishProgress(i) ;// 会回调onProgressUpdate方法
try {
Thread.sleep((Integer)params[0]) ;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return getString(R.string.dbcomplete);
}
@Override
protected void onProgressUpdate(Object... values) {
int value = (Integer)values[0];
showText.setText(value+"%") ;
pb.setProgress(value) ;
super.onProgressUpdate(values);
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
* 执行完毕调用的方法
*/
@Override
protected void onPostExecute(Object result) {
setTitle((String)result) ;
super.onPostExecute(result);
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/db"
android:text="@string/db"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/showText"
android:text="@string/showText"
/>
<ProgressBar
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/pb"
style="?android:attr/progressBarStyleHorizontal"
/>
</LinearLayout>
执行结果截图
AsyncTask可以非常方便的执行一些耗时的操作,能够方便的更新UI,当我们要进行一些耗时的操作时可以优先选用AsyncTask,比如图片加载......