我在我的智能语音文档转换中使用了asynctask,目的是将耗时的操作放到后台进行。
//当我们新建的类继承了AsyncTask时,会出现最基本的几个方法,然后我们把最耗时的操作(如联网操作,遍历sdcard的操作放到doinbackground中进行)
/**
* @author wangchaofei
*
* 下午5:19:29
*/
public class AsyncTaskDemoActivity extends AsyncTask<Void, Void, Void> {
//第一个参数是Params,传给doinbackground中,第二个参数Progress传给onProgressUpdate,第三个参数Result传给onPostExecute 如果不需要用到哪个参数了可以用Void来表示。
//首先调用onpreExecute方法
@Override
protected void onPreExecute() {
super.onPreExecute();
}
//紧接着调用doincachground方法
@Override
protected Void doInBackground(Void... params) {
publishProgress();
return null;
}
//此方法只有在后台进行调用,用来更新progress的进度 在UI中调用
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
//在doinbackground方法调用之后被调用 在UI中被调用
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
此代码为我的
public class MyAsyncTask extends AsyncTask<Void, Integer, List<String>> {
//采用异步的方式将耗时的操作(此处为遍历sdcard的文件)放到后台中运行,此时不影响activity的oncreate的运行
@Override
protected void onPreExecute() {
super.onPreExecute();
}
//doinbackground执行完之后return的list数组是直接传给了onPostExecute中。
@Override
protected List<String> doInBackground(Void... params) {
Searchfile sf = new Searchfile(); //自定义的搜索sdcard的所有的文件的处理类
listpath = new ArrayList<String>();
String filepath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
List<String> listlist = sf.getAllFileName("/" + filepath+"/SmartVoice/", listpath);
publishProgress(listlist.size());
System.out.println("打印listlist的值"+listlist.toString());
rightname = sf.getFileName(listlist); // rightname为数据源
System.out.println("打印子线程rightname的值"+rightname.toString());
return rightname;
}
@Override
protected void onPostExecute(List<String> result) {
super.onPostExecute(result);
progress.dismiss();
for (int i = 0; i < rightname.size(); i++) {
int lastname = rightname.get(i).lastIndexOf("/");
String name = rightname.get(i).substring(lastname + 1);
MyFile mfname = new MyFile();
mfname.setFilename(name);
mfname.setFiletype(null);
filename.add(mfname);
}
myadapter = new Myadapter(MainActivity.this, filename);
setListAdapter(myadapter);
}
//如果在doinbackground中加入了publishProgress(listlist.size());则表示此时加入了进度条,进度条的更新使用此方法
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progress.setProgress(values[0]);
}
}