使用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)可以在任务运行中调用,用来发布任务进度,提升用户体验

 

 

  

 

posted @ 2016-07-06 22:34  thinfog  阅读(600)  评论(0编辑  收藏  举报