异步任务AsyncTask使用
来源:互联网 发布:博鼎软件科技有限公司 编辑:程序博客网 时间:2024/04/25 06:57
Android的UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕绘图事件等,因此其他操作不应该、也不能阻塞UI线程,否则UI界面将会停止响应,引发ANR(Application Not Responding)异常。为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后在Textview中将其源代码显示出来,此时就应该将连接网络、获取网络数据的操作放在新线程中完成。问题是:获取网络数据之后,新线程不允许直接更新UI组件。
为了解决新线程不能更新UI组件的问题,Android提供了如下几种解决方案。
- 使用Handler实现线程之间的通信
- View.post(Runnable)
- View.postDelayed(Runnable,long)
相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现,后面的三种方式可能导致编程略显烦琐,而异步任务AsyncTask则可进一步简化这种操作。
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask时需要指定如下三个泛型参数
- Params:启动任务执行的输入参数的类型。
- Progress:后台任务完成的进度值的类型。
- Result:后台执行任务完成后返回结果的类型。
使用AsyncTask只需如下三步即可
- 创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为void。
- 根据需要实现AsyncTask的如下方法。
- doInBackground(Params...):重写该方法就是后台线程将要完成的任务。该方法可以调用public Progress(Progress...values)方法更新任务的执行进度。
- onProgressUpdate(Progress...values):在doInBackground()方法中调用public Progress()方法更新任务的执行进度后,将会触发该方法。
- onPreExecute():该方法将在执行后台耗时操作前被调用。通常该方法用于完成一些初始化的准备工作,比如在界面上显示进度条等。
- onPostExecute(Result result):当doInBackground()方法完成后,系统会自动调用onPostExecute()方法,并将doInBackground()方法的返回值传给该方法。
3. 调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务。使用AsyncTask时必须遵守如下规则。
- 必须在UI线程中创建AsyncTask的实例。
- 必须在UI线程中调用AsyncTask的execute()方法。
- AsyncTask的doInBackground、onProgressUpdate、onPreExecute、onPostExecute方法不应该由程序员调用,而是由Android系统负责调用。
- 每个AsyncTask只能被执行一次,多次调用将会引发异常。
下面的实例使用AsyncTask异步下载网络资源,其中一个文本框用于显示从网络下载的页面代码,一个按钮用于激发下载任务。
public class MainActivity extends Activity {private Button btnStart;private TextView tvContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnStart = (Button) findViewById(R.id.btnStart);tvContent = (TextView) findViewById(R.id.tvContent);btnStart.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {DowloadTask task = new DowloadTask(MainActivity.this);try {task.execute(new URL("http://www.baidu.com"));} catch (MalformedURLException e) {e.printStackTrace();}}});}class DowloadTask extends AsyncTask<URL,Integer,String>{ProgressDialog pdialog;int hasRead = 0;Context mContext;public DowloadTask(Context ctx){mContext = ctx;}@Overrideprotected String doInBackground(URL... params) {StringBuilder sb = new StringBuilder();try {URLConnection conn = params[0].openConnection();BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));String line = null;while((line = br.readLine()) != null){sb.append(line+"\n");hasRead++;publishProgress(hasRead);}return sb.toString();} catch (Exception e) {e.printStackTrace();}return null;}@Overrideprotected void onPreExecute() {pdialog = new ProgressDialog(mContext);pdialog.setTitle("任务正在执行中");pdialog.setMessage("任务正在执行中,敬请等待...");pdialog.setCancelable(false);pdialog.setMax(202);pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pdialog.setIndeterminate(false);pdialog.show();}@Overrideprotected void onPostExecute(String result) {tvContent.setText(result);pdialog.dismiss();}@Overrideprotected void onProgressUpdate(Integer... values) {tvContent.setText("已经读取了【"+values[0]+"】行!");pdialog.setProgress(values[0]);}}}该程序的重点是实现AsyncTask的子类,实现该子类时实现了如下4个方法。
- doInBackground():该方法的代码完成实际的下载任务。
- onPreExecute():该方法的代码负责在下载开始的时候显示一个进度条。
- onProgressUpdate():该方法的代码负责随着下载进度的改变更新进度条的进度值。
- onPostExecute():该方法的代码负责当下载完成后、将下载的代码显示出来。
0 0
- 异步任务AsyncTask使用
- 异步任务AsyncTask使用
- AsyncTask异步任务使用解析
- 异步任务AsyncTask的使用
- 使用AsyncTask运行异步任务
- 使用AsyncTask运行异步任务
- AsyncTask异步任务使用详解
- AsyncTask异步任务类使用
- AsyncTask异步任务的使用
- 异步任务AsyncTask使用解析
- Android异步任务AsyncTask使用
- 异步任务AsyncTask使用解析
- [Android]异步任务AsyncTask使用解析
- [Android]异步任务AsyncTask使用解析
- [Android]异步任务AsyncTask使用解析
- [Android]异步任务AsyncTask使用解析
- [Android]异步任务AsyncTask使用解析
- 使用AsyncTask异步任务更新进度
- 周易起名方法C语言程序
- zzuli OJ 1098: 复合函数求值(函数专题)
- 杭州电子科技大学acm--2012
- HDUOJ Sum Problem 题目1001
- $("span", this)等价于$(this).find('span')
- 异步任务AsyncTask使用
- Ubuntu安装swftools
- Mac上没有apt-get工具,
- 自定义AttributeSet属性
- Highcharts主要组成
- 51开发环境搭建
- 黑马程序员-----数据库
- HDUOJ A+B 题目1000
- Linux下安装Nginx操作详解