前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android | AsyncTask基础梳理

Android | AsyncTask基础梳理

作者头像
凌川江雪
发布2019-11-12 16:12:15
5590
发布2019-11-12 16:12:15
举报
文章被收录于专栏:李蔚蓬的专栏李蔚蓬的专栏
  • AsyncTask. 异步任务
    • 目的:方便后台线程中操作后更新UI 封装并简化了异步操作
    • 实现:ThreadHandler进行了封装
    • 实质:Handler异步消息处理机制
    • 参数是泛型:<Params,Progress,Result>
    • UI操作:onPreExecuteonPostExecute
    • 后台线程操作 doInBackground
    • 输入输出:Params(入),Result(出)
    • 进度显示:onProgressUpdate
  • ANR(Application Not Responding)
    • 应用程序无响应, 原因:UI线程被耗时任务(网络请求、下载上传、加载图片等)阻塞,界面卡死; 所以, 注意适当开启异步任务、子线程; 处理耗时操作,防止UI线程出现ANR现象
  • UI线程做主线程, 子线程做工作线程;
  • 如果在子线程更新UI更新主线程的东西, app会闪退,崩溃, 保证线程安全; 子线程可以通过以下几个方法, 切换到主线程更新:
    • Activity.runOnUiThread(Runnable)
    • View.post(Runnable)
    • View.postDelayed(Runnable,long)

AsyncTask解析

  • 查看AsyncTask源码: 可以在项目的任意位置,Ctrl+N,打开输入框,输入想要查看的类名, 点击搜索到的类名,即可前往查看源码:
  • 可以看到首先AsyncTask它是个抽象类, 参数都是泛型:
使用
  • 使用时首先需要新建一个类,继承AsyncTask 泛型要填包装类,或者自定义的Model类型 系统要求至少一定要继承doInBackground()这个方法, 即在后台子线程进行的一个方法, doInBackground()参数类型 即泛型的第一个参数类型,即入参Params参数类型 return 返回的是结果,即泛型的第三个参数:
public class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {

        @Override
        protected Boolean doInBackground(String... strings) {
            return null;
        }
    }
  • String...中的三个点, 表示该参数的长度是可变的;
  • 写完定义类之后, 在主线程new一下即可, 使用execute(),传入可变长度的入参, 即可启动AsyncTask
public class MainActivity extends AppCompatActivity {

    //logt 然后回车,快速生成!!!!!!!!
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new DownloadAsyncTask().execute("哈喽", "早上好");
    }

    public class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {

        /**
         * 方法执行在异步任务之前,执行在主线程中!!
         * 方法体中,可以 ;‘’;操作UI !!
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Boolean doInBackground(String... params) {

            // fori 回车 快速生成!!!!!!!!!!!
            for (int i = 0; i < 10000; i++) {
                Log.i(TAG, "doInBackground " + i +
                        ": " + params[0] + "," + params[1]);
            }
            return true;
        }
    }
}

运行:

  • 各方法作用概述,如代码中注释:
public class MainActivity extends AppCompatActivity {

    //logt 然后回车,快速生成!!!!!!!!
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new DownloadAsyncTask().execute("哈喽", "早上好");
    }

    public class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {

        /**
         * 方法执行在异步任务之前,执行在主线程中!!
         * 方法体中,可以 ;‘’;操作UI !!
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        /**
         * 本方法运行在子线程中,
         * 处理工作内容、耗时操作
         *
         * @param params
         * @return
         */
        @Override
        protected Boolean doInBackground(String... params) {

            // fori 回车 快速生成!!!!!!!!!!!
            for (int i = 0; i < 10000; i++) {
                Log.i(TAG, "doInBackground " + i +
                        ": " + params[0] + "," + params[1]);

                publishProgress(i);//抛出进度
            }
            return true;
        }

        /**
         * 本方法运行在主线程中,可以处理结果
         *
         * 当任务执行完了,会把上一个doInBackground()的参数传递过来
         * @param aBoolean
         */
        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
        }

        /**
         * 本方法运行在主线程
         * 进度变化就在这个方法处理
         * 接收来自 doInBackground()中 publishProgress()抛出的进度,
         * 并处理
         *
         * @param values 类型是定义时的第二个泛型参数,
         *               数据来自 doInBackground()的 publishProgress()
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
        }
    }
}
补充
  • onCancelled()
    • 运行在:主线程 调用时刻:当异步任务被取消时被调用 作用:可用于做界面取消的更新
  • 注意: 不要直接调用onPreExecute()、doInBackground()、onProgressUpdate()、onPostExecute)和onCancelled()方法 AsyncTask对象必须在主线程创建;
  • 开始和结束异步任务的方法: execute(Params...params) 必须在主线程中调用 作用:表示开始一个异步任务 注意:一个异步对象只能调用一次execute()方法
  • cancel(booleanmayInterruptIfRunning) 必须在主线程中调用 作用:表示停止一个异步任务
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AsyncTask解析
    • 使用
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档