Android提供的异步任务方法(如果只是调用一次,那就不推荐用这个方法,因为这个异步任务内部有线程池,最少开启5个,保持活动的有10个,最大支持128个)
/**
* 第一个参数:执行异步任务传递的参数 在execute()方法里传入参数
* 第二个参数:执行异步任务的进度
* 第三个参数:异步任务的返回值
*/
new AsyncTask<Context, Integer, List<ContactInfo>>(){
@Override
protected List<ContactInfo> doInBackground(Context... params) {
try {
publishProgress(1);//这个参数传递给了onProgressUpdate方法
Thread.sleep(1000);
publishProgress(30);
Thread.sleep(1000);
publishProgress(70);
Thread.sleep(1000);
publishProgress(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
infos = ContactInfoProvider.getContactInfos(params[0]);
return infos;//这个方法的返回值传到了onPostExecute方法参数中
}
@Override
protected void onProgressUpdate(Integer... values) {
int number = values[0];
Toast.makeText(getApplicationContext(), "当前进度:"+number, Toast.LENGTH_SHORT).show();;
super.onProgressUpdate(values);
}
@Override
protected void onPreExecute() {
ll_select_contact.setVisibility(View.VISIBLE);
super.onPreExecute();
}
@Override
protected void onPostExecute(List<ContactInfo> result) {
System.out.println(result.size());
ll_select_contact.setVisibility(View.INVISIBLE);
lv_select_contact.setAdapter(new ContactAdapter());
super.onPostExecute(result);
}
}.execute(this);//传递参数给异步任务
自定义异步方法
import android.os.Handler;
import android.os.Message;
public abstract class MyAsynTask {
public abstract void onPreExecute();//执行耗时任务之前要执行的操作(例如View的显示)
public abstract void doInBackground();//需要开启新线程的操作,在这个方法里执行
public abstract void onPostExecute();//执行完耗时操作后要执行的方法(例如View的隐藏)
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
onPostExecute();
}
};
public void execute() {
onPreExecute();
new Thread() {
public void run() {
doInBackground();
handler.sendEmptyMessage(0);
};
}.start();
}
}