看代码吧!注释。。。
package com.example.asynctask; import android.app.Activity; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private TextView t1 ; // AsyncTask启动时 标识 private TextView t2 ; // AsyncTask运行时 标识 private TextView t3 ; // AsyncTask运行完时 标识 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); t1 = (TextView) findViewById(R.id.textView1) ; t2 = (TextView) findViewById(R.id.textView2) ; t3 = (TextView) findViewById(R.id.textView3) ; Button btn = (Button) findViewById(R.id.button1) ; btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 点击按钮启动线程, // execute传入的参数是泛型的第一个类型值,可多个 DemoAsyncTask task = new DemoAsyncTask() ; task.execute("张小娴") ; } }) ; } // 第一个泛型 启动线程时传入的参数类型 // 第二个泛型 线程运行时线程运行状态的标识参数类型 // 第三个泛型 线程运行结束时标识的参数类型 private class DemoAsyncTask extends AsyncTask<String, String, Long> { // 线程的运行主体部分,相当于继承Thread中的run方法 @Override protected Long doInBackground(String... params) { // TODO Auto-generated method stub if(params[0].equals("张小娴")) { for (long i = 0; i < 20000; i++) {
// 调用这个方法更新界面 publishProgress(String.valueOf(i)) ; } } return (long) 3210; } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); } // 线程启动时最先执行的方法,该方法可以做一些线程运行的准备工作 @Override protected void onPreExecute() { t1.setText("启动了") ; } // 线程运行时,更新界面的一个方法,例如进度条之类的 // 这里不断更新textview中的数字,数字的值是doInBackground方法中的for内部的i值 // 具体看doInBackground方法 @Override protected void onProgressUpdate(String... values) { // TODO Auto-generated method stub t2.setText(values[0]) ; } // 线程执行完成后所做的工作,这里做的是t3 settext为3210, // 这个3210是由doInBackground方法返回的值 // 一般在这个方法中做一些更新界面的操作 @Override protected void onPostExecute(Long result) { t3.setText(String.valueOf(result)) ; // t3.setText("完成") ; } } }
要运行起来,只需要在布局文件中添加几个textview和一个button即可。
需要注意的是,AsyncTask只能被主线程启动,不能被子线程启动。
需要被子线程启动的线程,可以直接继承Thread实现,或者实现Runnable接口。