为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
03-05 11:24:38.508: D/mytask(22628): onPreExecute
03-05 11:24:38.508: D/mytask(22628): doInBackground params = address len=1
03-05 11:24:39.508: D/mytask(22628): onProgressUpdate value=1 len=1
03-05 11:24:40.508: D/mytask(22628): onProgressUpdate value=2 len=1
03-05 11:24:41.518: D/mytask(22628): onProgressUpdate value=3 len=1
03-05 11:24:42.518: D/mytask(22628): onProgressUpdate value=4 len=1
03-05 11:24:43.518: D/mytask(22628): onProgressUpdate value=5 len=1
03-05 11:24:43.518: D/mytask(22628): onPostExecute result=fuck
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
package com.example.aynctaskpro;
import android.annotation.SuppressLint;
import android.os.AsyncTask;
import android.util.Log;
public class MyTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
Log.d("mytask", "doInBackground params = "+params[0]+" len="+params.length);
try {
Thread.sleep(1000);
publishProgress(new Integer[]{1});
Thread.sleep(1000);
publishProgress(new Integer[]{2});
Thread.sleep(1000);
publishProgress(new Integer[]{3});
Thread.sleep(1000);
publishProgress(new Integer[]{4});
Thread.sleep(1000);
publishProgress(new Integer[]{5});
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "fuck";
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
Log.d("mytask", "onCancelled");
super.onCancelled();
}
@SuppressLint("NewApi")
@Override
protected void onCancelled(String result) {
// TODO Auto-generated method stub
Log.d("mytask", "onCancelled result="+result);
super.onCancelled(result);
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
Log.d("mytask", "onPostExecute result="+result);
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
Log.d("mytask", "onPreExecute");
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
Log.d("mytask", "onProgressUpdate value="+values[0]+" len="+values.length);
super.onProgressUpdate(values);
}
}
package com.example.aynctaskpro;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MyTask task = new MyTask();
task.execute("address");
// Handler h = new Handler();
// h.postDelayed(new Runnable(){
//
// @Override
// public void run() {
// // TODO Auto-generated method stub
// Log.d("mytask", "cancel="+task.cancel(false));
// }
//
// }, 3000);
}
}
03-05 11:24:38.508: D/mytask(22628): onPreExecute
03-05 11:24:38.508: D/mytask(22628): doInBackground params = address len=1
03-05 11:24:39.508: D/mytask(22628): onProgressUpdate value=1 len=1
03-05 11:24:40.508: D/mytask(22628): onProgressUpdate value=2 len=1
03-05 11:24:41.518: D/mytask(22628): onProgressUpdate value=3 len=1
03-05 11:24:42.518: D/mytask(22628): onProgressUpdate value=4 len=1
03-05 11:24:43.518: D/mytask(22628): onProgressUpdate value=5 len=1
03-05 11:24:43.518: D/mytask(22628): onPostExecute result=fuck