AsyncTaskde 的使用
来源:互联网 发布:在阿里云搭建网站 编辑:程序博客网 时间:2024/06/06 23:54
AsyncTask的定义:
public abstract class AsyncTask<Params, Progress, Result> {
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
- Params 启动任务执行的输入参数,比如HTTP请求的URL。
- Progress 后台任务执行的百分比。
- Result 后台执行任务最终返回的结果,比如String,Integer等。 在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。
一个异步任务的执行一般包括以下几个步骤:
- execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
- onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
- doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。也可以另外写一个方法执行操作,然后在此调用。(如果你需要进行网络操作,那么相应的代码应当在此被执行。)
- onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
- onPostExecute(Result result),当后台操作结束时,此方法将会被调用,result为doInBackGround的返回值。计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
- 异步任务(AsyncTask)的实例必须在UI线程中创建。
- execute(Params... params)方法必须在UI线程中调用。
- 不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
- 不能在doInBackground(Params... params)中更改UI组件的信息。
一个任务实例只能执行一次,如果执行第二次将会抛出异常。
下面是一个例子:public class asyncTaskTest extends Activity { private TextView textView; private static final int DIALOG_KEY = 0; public String httpadd="http://codesimple.farbox.com/category"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_async_task_test); textView=(TextView)findViewById(R.id.textView); /** * 1、异步任务在UI线程中被创建并执行,参数可以全为空 */ new MyAsyncTask().execute(null, null, null); } private class MyAsyncTask extends AsyncTask<URL, Integer, String> { /** * 2、execute被调用后立刻执行此方法,执行异步任务前对UI做些提示。 */ protected void onPreExecute() { showDialog(DIALOG_KEY); } /** * 3、在onPreExecute()完成后立即执行。 * 此方法将接收输入参数和返回计算结果。 * 该方法并不运行在UI线程当中,主要用于异步操作, * 这里的参数对应AsyncTask中的第一个参数,即输入参数。 * @return 对应AsyncTask的第三个参数,这个参数会传到onPostExecute()里。 */ protected String doInBackground(URL... urls) { StringBuffer buffer=new StringBuffer(); //下面的代码需要jsoup的包,请自行搜索下载。 Document doc; try { doc = Jsoup.connect(httpadd).get(); Elements ListDiv = doc.getElementsByAttributeValue("class","title"); for (Element element :ListDiv) { Elements links = element.getElementsByTag("a"); for (Element link : links) { String linkHref = link.attr("href"); String linkText = link.text(); buffer.append("link=http://codesimple.farbox.com"+linkHref+"\r\n"); buffer.append("title="+linkText+"\r\n"); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return buffer.toString(); } /** * 4、onProgressUpdate在UI线程中执行,可以对UI空间进行操作。 * @param progress 对应AsyncTask中的第二个参数,代表后台执行进度。 */ protected void onProgressUpdate(Integer... progress) {// setProgressPercent(progress[0]); } /** * 5、此方法在doInBackground方法执行结束之后被调用 * doInBackground的返回结果将做为参数传到此方法中。 * 此方法被UI线程调用,计算结果将传递到UI线程,并且在界面上展示给用户。 * @param result 对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值) */ protected void onPostExecute(String result) { textView.setText(result); removeDialog(DIALOG_KEY); } } protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_KEY: { ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage("获取数据中 请稍候..."); dialog.setIndeterminate(true); dialog.setCancelable(true); return dialog; } } return null; }}
布局文件xml代码:
<LinearLayout 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:orientation="vertical" > <ScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Medium Text" android:id="@+id/textView" /> </ScrollView></LinearLayout>
更详细的说明请移步详解Android中AsyncTask的使用、Android中AsyncTask的简单用法、android AsyncTask介绍。
参考:
- 详解Android中AsyncTask的使用
- Android中AsyncTask的简单用法
- android AsyncTask介绍
感谢原作者。
0 0
- AsyncTaskde 的使用
- Android 事件监听 handler AsyncTaskde也是一种并发
- GUID使用的使用
- ${}的使用
- 的使用
- @[],@()的使用
- ->的使用
- +、-、*、/、%的使用
- &&的使用
- %:的使用
- Makefile中使用$$的使用
- Makefile中使用$$的使用
- Red5的使用--使用日志
- prefernce的使用具体使用
- 【工具使用】git 的使用
- 关于使用AsyncTaskLoader的使用
- 使用CABasicAnimation的基本使用
- 使用RocketMQ的客户端使用
- Android app中调用启动其他应用(系统应用和第三方应用)2016.10.25新增android 6.0打电话api
- Selective Search for Object Recognition(泛读)
- 活动的启动模式
- 字符串问题及关于字符串的函数
- 第14周 电子词典——二分法
- AsyncTaskde 的使用
- 丢了自己,记得捡回来
- ubuntu 14.1 编译ffmpeg
- iOS开发之获取系统相册中的图片与视频(内带url转换)
- 神经网络编程入门
- 网页中嵌入天气预报
- Android Studio升级1.0 RC后,如何从GitHub导入项目以及对原项目的Gradle配置修改
- 意念控制智能车项目进展2014.12.06-07
- Java系统插件开发原理与实例