创建一个新工程LearnAsyncTask,一个空Activity,上面放置几个控件
控件
| 属性
| 功能描述
| EditText
| id="@+id/etUri"
hint="请输入你要获取网络数据的Uri"
text="http://www.sina.com.cn"
| | Button
| text="读取http数据"
id="@+id/btnRead" /
| | ScrollView
| | 由于读取的内容可能很长,会好几页,所有用此包裹TextView
| TextView
| id="@+id/tvRead"
hint="读取的数据http数据将在此显示"
| |
<
|
本程序介绍:AsyncTask 的用法,包括传入参数、设定后台任务doInBackground、过程信息的处理(publishProgress方法和onProgressUpdate事件)等
AsyncTask 第一个参数:是传入的对象(用户对AsyncTask进行初始化的一些数据),第二个参数:处理的过程中返回值的数据类型;第三个参数:返回结果的数据类型
/为AsyncTask实例对象必须实现(原来未实现)doInBackground方法,该方法与线程的run方法非常类似,执行后台的耗时操作,不能在此代码中直接操作UI
构成函数的第一个参数会传给doInBackground的params的第一个数据
只可以execute一次,执行多次就报异常
| 可能需要重写的方法和事件
|
|
| doInBackground
| 不要手工调用
该方法中调用的publishProgress()中传入的数据类型与AsyncTask的第二个参数类型必须一致,否则会报错。也与onProgressUpdate的参数一致
|
| onCancelled
| 终止操作(本实例中不做讲解,有空再讲解哦)
|
| onCancelled(Strings)
| 终止操作(本实例中不做讲解,有空再讲解哦)
|
| onPostExecute
| 不要手工调用,AsyncTask执行之后会调用该事件
|
| onPreExecute
| 不要手工调用,AsyncTask执行之前会调用该事件
|
| onProgressUpdate
| 执行任务的过程中,用于对外发布当前执行任务的进度。参数与声明AsyncTask的第二个参数一致
|
|
|
|
|
|
publicclassMainActivityextendsAppCompatActivity{
privateTextViewtvRead;
privateEditTextetUri;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvRead=(TextView)findViewById(R.id.tvRead);
etUri=(EditText)findViewById(R.id.etUri);
findViewById(R.id.btnRead).setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
newReadHttpAsyncTask().execute(etUri.getText().toString());
}
});
}
//读取http数据的方法
privateclassReadHttpAsyncTaskextendsAsyncTask<String,Integer,String>{
@Override
protectedvoidonCancelled(){
super.onCancelled();
}
@Override
protectedvoidonCancelled(Strings){
super.onCancelled(s);
}
@Override
protectedvoidonPostExecute(Strings){
tvRead.setText(s);
super.onPostExecute(s);
}
@Override
protectedvoidonPreExecute(){
super.onPreExecute();
}
@Override
protectedvoidonProgressUpdate(Integer...values){
super.onProgressUpdate(values);
setTitle("已经完成比例"+Integer.toString(values[0]));
}
//*doInBackground中不能直接操作UI。
@Override
protectedStringdoInBackground(String...params){
try{
URLurl=newURL(params[0]);
URLConnectionconnection=url.openConnection();
inttotal=connection.getContentLength();//获取要读取的内容总数量
InputStreamis=connection.getInputStream();
InputStreamReaderisr=newInputStreamReader(is,"utf-8");
BufferedReaderbr=newBufferedReader(isr);
Stringline;
StringBuilderstringBuilder=newStringBuilder();
while((line=br.readLine())!=null){
stringBuilder.append(line);
System.out.println("===输出信息到Logcat:"+line);
//注意publishProgress中传入的数据类型与AsyncTask的第二个参数类型必须一致,否则会保存
publishProgress(stringBuilder.toString().length()/total);
}
br.close();
isr.close();
is.close();
returnstringBuilder.toString();
}catch(MalformedURLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnnull;
}
}
}
|
|
|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理