AsyncTask是Android解决异步加载的一种方案,它比Handler和Message的方式更加轻量级。
一般的使用步骤:
自定义一个继承AsyncTask的类。自定义时可以传入AsyncTask的3个泛型参数,即Params,Progress和Result。Params是需要传入的参数,Progress是进程执行的百分比,Result是最终返回的结果。
实现从AsyncTask继承下来的方法。
主要有onPreExecute()、doInBackground(Params...)、onProgressUpdate(Progress...)和onPostExecute(Result)四种方法。
其中,
onPreExecute():执行实际后台操作之前被调用。
doInBackground(Params...):紧跟onPreExecute()之后进行的实际后台操作,一般进行比较耗时 的操作,更新实时任务进度,可以调用publishProgress()。
onProgressUpdate(Progress...):运行与UI线程,可更新实时进度。
onPostExecute(Result):运行于UI线程,其参数就是doInBackground()的返回值。
3.在主线程中创建AsyncTask对象,并调用execute()方法。
具体示例来展示AsyncTask异步加载:
MainActivity代码:
public class MainActivity extends Activity {
private TextView textview;
private Button button;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview=(TextView)findViewById(R.id.text);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
LoadTask task=new LoadTask();
task.execute();
}
});
}
private class LoadTask extends AsyncTask<Void,Integer,String>{
private ProgressDialog progressdialog;
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
int sum=1;
while(sum<=10){
try {
Thread.sleep(1000);
publishProgress(sum);
sum++;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "加载完成。";
}
//紧跟onPreExecute()之后紧跟的操作,进行耗时操作,利用publishprogress()更新。
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
progressdialog=progressdialog.show(MainActivity.this, "AsyncTask Demo", "载入中...",true);
}
//在doinbackground之前调用,创建一个对话框。
protected void onProgressUpdate(Integer...values){
textview.setText(values[0]*10+"%");
}
//运行于ui线程,更新实时进度。
protected void onPostExecute(String result){
progressdialog.dismiss();
textview.setText(result);
}
//运行于ui线程,返回值就是doInBackground()的返回值。
}
}
xml代码:
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="--" />
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/text"
android:layout_marginTop="24dp"
android:text="开始载入" />
点击按钮,即可实现异步加载。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。