zoukankan      html  css  js  c++  java
  • Android中 AsyncTask

    Android AsyncTask

      在程序处理中必然会遇上耗时的操作,如访问网络,下载数据,访问数据库等,如何存在耗时的操作

    又不能影响界面显示交互。

      在某些耗时可以控制的情况下,我们可以分批操作,对于事件循环执行;但有些情况如访问网络是没

    控制的,处理过程属于被动的。这类情况通常都是放在一个新的线程里面执行。

      Android中应用程序启动后运行在主线程中(UI线程),处理界面交互,控件事件派发,界面设置显示;

    这些元素只能在UI线程操作。故不能在UI线程中处理耗时的动作,影响界面流畅操作,而出现ANR。

      耗时的数据处理操作都需要在新的线程中后台进行,基于线程的方式处理数据有很多形式:有Service,

    Thread+Handler,AsyncTask。这里看一下AsyncTask的使用。

    AsyncTask:

      更恰当和容易的使用UI线程,后台操作都交给AsyncTask类完成,操作结果会返回给UI线程,这中间无需自己

    控制Thread和Handler的操作。所以感觉似乎就是将Thread和Handler等复杂的事情封装来,提供固定的模式进行

    后台操作,能更安全简洁的进行后台操作。

    AsyncTask用法:

           AsyncTask是一个抽象类。

    public abstract class AsyncTask<Params, Progress, Result> {}

    Here is an example of subclassing:

           

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
          public void onPreExecute() {
            super.onPreExecute();
          }
    protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0;
    for (int i = 0; i < count; i++) {
    totalSize
    += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100));
    // Escape early if cancel() is called if (isCancelled())           break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }

     

    Once created, a task is executed very simply:

           new DownloadFilesTask().execute(url1, url2, url3);

     

    AsyncTask的泛型类型:

        •Params  启动任务执行时输入参数,比如HTTP请求的URL。

        •Progress 后台任务执行的进度。

      •Result   后台执行任务最终返回的结果,比如String。

      当然各参数的具体作用都可以是任意定义的。

     

    AsyncTask执行四步:

    •       onPreExecute():Task被execute后被执行,可以为UI线程中做一些准备工作:界面显示。
    •       doInBackground:onPreExecute调用执行之后,由后台线程调用。此方法运行在后台线程中, 

          耗时的操作都是在这里执行。使用publishProgress方法将执行的进度结果传递给UI线程,调用接口到onProgressUpdate。

    •   onProgressUpdate:在publishProgress方法被调用之后,由UI线程调用,传递后台执行的进度,可以更新UI显示表明后台操作进度。
    •   onPostExecute:后台计算完成之后doInBackground执行完成之后,由UI线程中调用,传递后台执行的结果。

     

    取消Task:

           Task可以被取消,通过cancel方法。取消之后onPostExecute不会被调用,而是onCancelled方法被调用。

     

    AsyncTask 使用规则:

    1.        AsyncTask必须在UI Thread中加载;
    2.        AsyncTask实例必须在UI Thread中创建;
    3.        Execute(Params…)方法必须在UI Thread中调用;
    4.        不要主动调用方法onPreExecute,doInBackground,onProgressUpdate,onPostExecute;
    5.        Task只能被执行一次,之后再执行会异常。

     

  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/bastard/p/2571067.html
Copyright © 2011-2022 走看看