异步任务类的使用是为了,能够通过子线程加载数据,而在Ui线程刷新界面
下面通过一个例子具体讲解异步任务类的使用
1定义异步任务类,异步任务类必须继承AsyncTask
//三个参数的意义:第一个是启动任务执行的输入参数的类型,第二个参数是完成进度的值的类型,第三个是任务完成后返回结果的类型,这三个参数若不需要指定类型可写void
public classMyAsyncTask extends AsyncTask<URL, Integer, String>{
ProgressDialogdialog;//进度条对话框
int hasRead=0;//读取进度
Contextcontext;
int max;//进度的最大值
private Results myResult;
public MyAsyncTask(Contextcontext,intmax,Results result){
this.context=context;
this.max=max;
this.myResult=result;
}
//后台线程执行的方法(相当于开启子线程加载数据),后台将要完成的任务执行的方法,调用publishProgress方法更新任务的执行进度
@Override
protected StringdoInBackground(URL... arg0) {
StringBuilderbuilder=newStringBuilder();
try {
URLConnectionconn=arg0[0].openConnection();//创建网络连接对象
BufferedReaderreader=newBufferedReader(newInputStreamReader(conn.getInputStream(),"UTF-8"));
Stringline=null;
while((line=reader.readLine())!=null){
builder.append(line+"/n");
hasRead++;
publishProgress(hasRead);//通知进度刷新
}
}catch(IOException e) {
e.printStackTrace();
}
return builder.toString();
}
//在doinbackGround方法中调用publishProgress()方法更新进度后执行
@Override
protected voidonProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setMessage("已经读取了"+values+"行");
dialog.setProgress(values[0]);
}
//当doinbackgroun执行完成后自动调用的方法,并将doinbackground的返回值传递给该方法
@Override
protected void onPostExecute(Stringresult) {
super.onPostExecute(result);
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
dialog.dismiss();
myResult.getResult(result);
}
//该方法将在执行后台耗时操作前调用,用于准备工作,一般在doInbackground方法前执行
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog=new ProgressDialog(context);
dialog.setTitle("任务正在执行中");
dialog.setMessage("任务正在执行中,请等待。。。。。");
dialog.setCanceledOnTouchOutside(false);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置进度条对话框是水平显示进度的,STYLE_SPINNER是圆形的不能显示进度
dialog.setMax(max);//设置进度的最大值
dialog.setIndeterminate(false);//设置进度条是否显示进度
dialog.show();
}
//获取数据后的回调接口
public interface Results{
void getResult(Stringresult);
}
}
2.定义异步任务类的实现类的实例,可通过方法启动异步任务类
num= (TextView) findViewById(R.id.num);
num.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View arg0) {
//定义异步任务类,必须定义在ui线程中,
MyAsyncTask task=newMyAsyncTask(MainActivity.this, 1,newMyAsyncTask.Results() {
@Override
public void getResult(Stringresult) {
num.setText(result);
}
});
try {
task.execute(new URL("http://www.weather.com.cn/data/cityinfo/101010100.html"));//通过该方法让异步任务类执行耗时操作,必须在ui线程中执行,有多个重载方法
}catch(MalformedURLException e) {
e.printStackTrace();
}
}
});
java.io.EOFException异常:http://blog.csdn.net/jiuweitianhu_12345/article/details/52469127
例子:https://yunpan.cn/cMCm3IH5ErYjj (提取码:ef66)