加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_潮州站长网 (http://www.0768zz.com/)- 物联安全、建站、操作系统、云计算、数据迁移!
当前位置: 首页 > 教程 > 正文

Android中异步加载类AsyncTask的实施

发布时间:2021-12-11 14:54:14 所属栏目:教程 来源:互联网
导读:我们都知道,Android为了安全方面的考虑,是不允许线程对UI线程进行直接操作的。 而如果我们想通过线程对界面进行操作,有如下的几种方法: 在子线程中提供了5中方法来实现与UI线程的交互: 第一种方法:Activity.runUiThread(Runnable); 第二种方法:View.p

我们都知道,Android为了安全方面的考虑,是不允许线程对UI线程进行直接操作的。
 
而如果我们想通过线程对界面进行操作,有如下的几种方法:
 
在子线程中提供了5中方法来实现与UI线程的交互:
 
第一种方法:Activity.runUiThread(Runnable);
 
第二种方法:View.post(Runnable);
 
第三种方法:View.postDelayed(Runnable);
 
第四种方法:Handler、Message、Looper
 
第五种方法:AsyncTask
 
 前面的几种方法就不多说了,本文主要介绍的就是最常用的AsyncTask的使用。
 
空谈是没用的,下面做一个例子来实现AsyncTask与UI线程的交互的例子——下载文件并显示下载进度
 
当doInBackground执行结束的时候会返回一个结果,这个结果如果重写了onPostExecute方法的会以参数的方式自动传入。
 
首先我们创建一个DownLoadAsyncTask 类,该类继承AsyncTask类。虽然我没有看过AsyncTask的源码,但是也能猜测是AsyncTask应该是一个抽象类,其中定义了抽象的方法doInBackground();
 
当我们继承这个类的时候,就会默认的重写doInBackground()方法了。
 
当然,这里为了显示效果,我们把着各类中所有的方法都显示出来。(右键该类的页面->source->override->选择全部的方法->OK,方法就会被添加进来了)
 
添加进来之后应该就会有下面代码的效果了。
 
当然,你也许会发现,你的AsyncTask后面的参数怎么和我不一样呢?
 
当然不会一样,因为我这个已经被我改过了。下面来讲一讲这些参数的含义吧。
 
AsyncTask的<>中的三个参数,按照顺序,第一个为doInBackground输入的参数类型,可以传入集合,比如String[]。第二个参数为显示进度的参数,第三个为doInBackground的返回类型以及onPostExecute的输入类型。
 
讲完了输入参数,接着就是各个方法的含义了。
 
这个按照加载时的先后顺序来讲。
 
第一个被执行的方法是onPreExecute();
 
这个方法主要的作用就是进行一些初始化的操作,比如这个方法中可以执行一些当前类中成员变量的实例化等等。就把这个方法想象成我们经常用到的init();方法吧。
 
其次被执行的方法是doInBackground();
 
这个就是这个类当中执行的主体了。比如我们例子当中直接添加一个下载的方法。
 
最后被执行的方法是onPostExecute();
 
我们可以做一些收尾工作,比如显示结果以及跳出弹出框提示下载完成等等。
 
// 第一个为doInBackground接受的参数类型,第二个为显示进度的参数,第三个为doInBackground返回和onPostExecute传入的参数。
public class DownLoadAsyncTask extends AsyncTask<String, Integer, File> {
 private TextView showmsg;
 
 public void setTextView(TextView showmsg) {
  this.showmsg = showmsg;
 }
 
 @Override
 protected File doInBackground(String... params) {
  // TODO Auto-generated method stub
  // 输入参数为String[]类型的,params[0]代表下载的文件的名称,params[1],代表下载文件的地址,params[2]代表存储到本地的地址
  // 下载文件
  File file = downLoadFile(params[0], params[1]);
  // 对下载好的文件进行改名操作
  return file;
 }
 
 @Override
 protected void onCancelled() {
  // TODO Auto-generated method stub
  super.onCancelled();
 }
 
 @Override
 protected void onPostExecute(File file) {
  // TODO Auto-generated method stub
  super.onPostExecute(file);
  // 传入的参数file即为doInBackground返回的file对象,处理该对象。我们暂时就获取到这个file的地址然后打印到页面上并提示下载完成吧。
  String path = file.getAbsolutePath();
  if(file==null||!file.exists()){
   showmsg.setText("文件下载失败");
   return;
  }
  showmsg.setText("文件地址为:"+path);
 }
 
 @Override
 protected void onPreExecute() {
  // TODO Auto-generated method stub
  super.onPreExecute();
 }
 
 @Override
 protected void onProgressUpdate(Integer... values) {
  // TODO Auto-generated method stub
  super.onProgressUpdate(values);
 }
 
 
}

(编辑:我爱制作网_潮州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读