安卓异步处理——AsyncTask<Params, Progress, Result>
2017-07-03 21:09
246 查看
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。
Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。
为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
依旧学习安卓类,先看api解释;
总结;
AsyncTask有四个重要的回调方法,分别是:onPreExecute、doInBackground, onProgressUpdate 和 onPostExecute。这四个方法会在AsyncTask的不同时期进行自动调用,我们只需要实现这几个方法的内部逻辑即可。这四个方法的一些参数和返回值都是基于泛型的,而且泛型的类型还不一样,所以在AsyncTask的使用中会遇到三种泛型参数:Params, Progress 和 Result,
小程序代码;
运行程序截图
Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。
为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
依旧学习安卓类,先看api解释;
AsyncTask类的介绍
AsyncTask类中的一些重要属性
实例代码
一些注意事项
总结;
AsyncTask有四个重要的回调方法,分别是:onPreExecute、doInBackground, onProgressUpdate 和 onPostExecute。这四个方法会在AsyncTask的不同时期进行自动调用,我们只需要实现这几个方法的内部逻辑即可。这四个方法的一些参数和返回值都是基于泛型的,而且泛型的类型还不一样,所以在AsyncTask的使用中会遇到三种泛型参数:Params, Progress 和 Result,
——————三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。 1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。 2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。 3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。 4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。 5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
小程序代码;
布局代码 <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" tools:context="com.zw.asynctaskpractice.MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:textSize="100dp" android:text="TextView" /> <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> </RelativeLayout>
MainActivity代码 package com.zw.asynctaskpractice; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.textView1); ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar1); new TestAsyncTask(MainActivity.this, tv, pb).execute(""); } }
AsyncTask子类代码 package com.zw.asynctaskpractice; import android.os.AsyncTask; import android.widget.ProgressBar; import android.widget.TextView; public class TestAsyncTask extends AsyncTask<String, Integer, String> { MainActivity activity; TextView textView; ProgressBar bar; public TestAsyncTask(MainActivity activity, TextView textView, ProgressBar bar ) { this.activity = activity; this.textView = textView; this.bar = bar; } //TestAsyncTask被后台线程执行后,被UI线程被调用,一般用于初始化界面控件,如进度条 @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); } //doInBackground执行完后由UI线程调用,用于更新界面操作 @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub //textView.setText(result); super.onPostExecute(result); } //在PreExcute执行后被启动AysncTask的后台线程调用,将结果返回给UI线程 @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub bar.setMax(300); int i = 30; while(true) { publishProgress((int)i); if(i == 0 ) break; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } i--; } return null; } protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub bar.setProgress(values[0]*10); textView.setText("" + values[0] + " s"); super.onProgressUpdate(values); } }
运行程序截图
相关文章推荐
- 关于AsyncTask<Params, Progress, Result>中三个参数的理解
- 解析AsyncTask<Params, Progress, Result>()
- android抽象类AsyncTask<Params, Progress, Result>
- <SYSU课程表>安卓应用介绍(附下载链接)
- Func<T, TResult> 委托使用详解
- struts.xml属性重名处理:关于<package><action><result>的name和namespace属性同名时struts2的处理
- Ulua热更新提高 <二> 发布到安卓真机开始更新
- C# Func<T,TResult>
- <result name="success" type="redirectAction">ro...
- Android初学笔记之<Progress进度条>
- android The method execute(Void[]) is ambiguous for the type new AsyncTask<Void,Void,Void>(){}
- 泛型委托 Action<T>和Func<T,TResult>
- 通过安卓中<include>标签findViewById时出现的bug及解决方案
- Func<T1, T2, TResult> 泛型委托
- Func<T, TResult> Delegate
- struts.xml配置文件中result的语法:<result name="" type="">xxxxx</result>
- AsyncTask<String ,Integer,Integer>类中各个方法的执行先后顺序
- Func<T, ..., TResult> 委托 实现方法嵌套
- 如何声明和使用 Func<T1, T2, TResult> 委托
- 安卓,从数据库抽取的数据,检索<br></n>等,并实现换行