使用AsyncTask类实现简单的异步处理操作
AsyncTask:
1.这是一种相比Handler更轻量级的处理异步任务的工具类
2.它和Handler类一样,都是为了不影响主线程(UI)而使用的((注:UI的更新只能在主线程中完成)
3.这个工具类提供了三个泛型的参数:
params:启动或执行任务的输入参数,例如:HTTP请求的URL
Progress:后台任务执行的百分比
Result:后台执行任务最终返回的结果,比如String
使用AsyncTask最少要重写这两个方法:
1.doInBackground(params··)
此方法在后台执行,比较耗时的操作都可以放在这里执行;
这里不能直接操作UI(主线程),此方法在后台线程执行;完成任务的主要工作,通常需要很长世间;
在此执行过程中可以调用publishProgress()来更新工作进度。
2.onPostExecute(Result)
相当于Handler处理UI的方式;
可以使用在doInBackground得到的结果处理和操作UI;
此方法在主线程中执行,任务执行的结果作为参数的返回。
如果有必要还可以重写一下三个方法:
onProgressUpdate();
这里可以使用进度条来显示任务执行的进度情况,用来增加用户体验。(此方法在主线程中执行)
onPreExecute();
这里是用户调用Execute的接口,当任务执行之前开始调用此方法;
可以在这里显示进度对话框
onCancelled();
此方法是用户调用取消的时候,自动调用的方法
使用AsyncTask类应当注意的地方:
1.此类的实例必须在主线程(UI交互)
2.execute方法必须在UIthread中调用;
3.不能手动调用自己重写的onPreExecute()等方法
4.该任务只能执行一次,多次调用会出现异常
一般情况下AsuncTask实例的运行过程:
1.AsyncTask.execute(URL)>>>onPreExecute()>>>doInBackground(String... params)>>>onPostExecute(String s)>>>ShowInTextView!
文字解释:使用execute()方法传入一个URL,onPreEXEcute()在执行doInBackground(String···params)之前先行加载,doInBackground(String···params)方法接收到的URL以数据方式存放在params中,所以可以使用一下步骤来实现读取URL数据,并从网络上获取数据的步骤,
具体的代码:
URL Url = new URL(params[0]); URLConnection connection = Url.openConnection(); InputStream inputStream = connection.getInputStream(); InputStreamReader ISR = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(ISR); String line; StringBuilder builder = new StringBuilder(); while ((line = bufferedReader.readLine())!=null){ builder.append(line); } bufferedReader.close(); inputStream.close(); return builder.toString();
//这里返回的String数据内容,会被onPostExecute(String s)接收,其中的内容就保存在S中
//可用重写其方法,来将从网页获得的数据进行处理,比如说在一个TextView中显示
@Override
protected void onPostExecute(String s) {
tvShow.setText(s);
super.onPostExecute(s);
}
//若是不在这个方法里添加将数据内容发布的代码,就会执行系统中的原始代码,
//但是在源码中,onPostExecute(String s)是一个抽象的方法,还未实现,所以若不重写
//onPostExecute(String s)将不执行任何操作
//并且经过查看源代码,这些重写的方法在源代码中都是抽象状态,没有任何的执行内容!
2.onProgressUpdate(Void... values)可以在任务运行中调用,用来发布任务进度,提升用户体验