Android 讲解:AsyncTask
2016-01-22 14:14
495 查看
AsyncTask是一个类,作用和
Hanlder一样,都是Android 中异步代码执行。相比
Hanlder,
AsyncTask比
Hanlder代码清晰,容易理解,前提是你已经熟练掌握
AsyncTask。
这里用一个模拟下载程序来使用AsyncTask 。
代码实例
main_Activity.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="cn.met0.android.asycntask.MainActivity" > <ProgressBar android:id="@+id/progressbar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout>
这个布局文件比较简单,就是一个进度条,用来显示下载进度。
DownAsyncTask.java
public class DownAsyncTask extends AsyncTask<Void, Integer, Boolean> { private ProgressBar progressBar; private Context context; public DownAsyncTask(ProgressBar progressBar,Context context) { this.progressBar = progressBar; this.context = context; } @Override protected void onPreExecute() { } @Override protected Boolean doInBackground(Void... params) { int i = 1; while(i++ != 50){ try { Thread.sleep(100); publishProgress(i * 100 / 50); } catch (InterruptedException e) { return false; } } return true; } @Override protected void onProgressUpdate(Integer... values) { int progress = values[0]; progressBar.setProgress(progress); } @Override protected void onPostExecute(Boolean result) { if(result){ Toast.makeText(context, "download success!!", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(context, "download fail!!", Toast.LENGTH_LONG).show(); } } }
下面一点一点解析这个类。
public class DownAsyncTask extends AsyncTask<Void, Integer, Boolean>{}
这个一个继承
AsyncTask的一个类。
有3个泛型
第一个Void, 是其他类启动
DownAsyncTask时传的参数类型。
第二个Integer ,这个一个下载程序,用Integer 代表下载的进度的类型。
第三个Boolean,这个是当执行完成后,返回的结果的类型。
可能以上的几个泛型还不是太理解,下面看看介绍函数的时候就明白了。
private ProgressBar progressBar;用来显示下载的进度
private Context context;在这个类中,作用只有一个,就是用来看到最后下载是否成功,用来做
Toast的参数。
public DownAsyncTask(ProgressBar progressBar,Context context)这个构造函数是用来初始化
progressBar和
context的。
protected void onPreExecute()是启动后台任务时执行的方法,主要用于界面的初始化,如加载一个下载进度条(这里我们进度条直接显示,无需加载,所有什么代码也没写)。
doInBackground(Void... params)后台任务的代码就在这里面编写,这个函数模拟了一个下载程序,当下载一点后,执行
publishProgress(Integer... progress)函数,参数progress 就是下载的进度。这里面不能直接操作UI 控件。
onProgressUpdate(Integer... progress)用作UI 更新,当
doInBackground(Void... params)函数执行了
publishProgress(Integer... progress)函数,则会间接的执行这个函数。
protected void onPostExecute(Boolean result)当后台任务函数执行完成后,则会返回一个返回值,AsyncTask 会调用这个函数并且把然会在传入进来。
MainActivity.java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressbar); new DownAsyncTask(progressBar,this).execute(); } }
new DownAsyncTask(progressBar,this).execute();启动下载后台任务。
运行一下
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories