android Asynctask 使用

本文介绍了Android中Asynctask的使用,包括其在子线程中异步更新UI的功能,利用线程池和Handler实现。详细讲解了Asynctask的实现逻辑,如需重写doInBackground、onPreExecute、onPostExecute和onProgressUpdate方法,并指出同一个Asynctask实例只能执行一次。同时,提供了相关的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,实现效果

子线程异步更新UI。里面使用的是线程池和handler 

 

2,实现逻辑

  • 写个类调用extends Asynctask

  • doInBackground必须重写,还需要添加onPreExecute,onPostExecute,onProgressUpdate

  • 调用打开

  • AsyncTask new出来的mTask 只能执行一次

3,实现代码


 

        TrafficTask mTask = new TrafficTask();

        // 开启任务   execute方法    只能在UI线程开启

        mTask.execute("haha", "hehe");



/**

     * 泛型1 运行 指定doInBackground的参数类型 execute的参数类型

     * 泛型2 进度 onProgressUpdate的参数类型publishProgress的参数类型

     * 泛型3 结束  onPostExecute的参数类型   doInBackground的返回值类型

     *

     * @author Administrator

     */

    private class TrafficTask extends AsyncTask<String, Integer, String> {





        // 执行前走的方法 一般这里初始化一个数据 方法运行在UI线程

        @Override

        protected void onPreExecute() {

            super.onPreExecute();

            mInfos = new ArrayList<TrafficInfo>();

        }





        // 执行后台任务 运行在子线程

        @Override

        protected String doInBackground(String... params) {

            // 可变参数 对应的数组

            // String haha = params[0];

            // String hehe = params[1];





            SystemClock.sleep(1000);

            // 获取包管理器

            // 参1 获取额外信息的flag 如果不需要 就写0

            // 获取全部安装的应用信息

            List<PackageInfo> installedPackages = pm.getInstalledPackages(0);

            for (PackageInfo packageInfo : installedPackages) {

                // packageInfo对应menifest文件里的manifest根节点

                // // 包名

                // String packageName = packageInfo.packageName;

                // applicationInfo对应application节点信息

                ApplicationInfo applicationInfo = packageInfo.applicationInfo;

                int uid = applicationInfo.uid;

                // 名字

                String name = applicationInfo.loadLabel(pm).toString();

                // 图片

                Drawable icon = applicationInfo.loadIcon(pm);





                // 根据程序的uid 获取对应的流量

                long rx = TrafficStats.getUidRxBytes(uid);

                long tx = TrafficStats.getUidTxBytes(uid);





                TrafficInfo info = new TrafficInfo(name, icon, tx, rx);

                mInfos.add(info);





                // publishProgress();通知onProgressUpdate执行





            }

            return "{'result':'haha'}";

        }





        // 任务结束后执行 运行在UI线程 一般更新界面

        @Override

        protected void onPostExecute(String result) {

            super.onPostExecute(result);

            // 设置数据

            lvTraffic.setAdapter(new TrafficAdapter());

            // 进度圈消失

            llLoading.setVisibility(View.INVISIBLE);

        }





        // 更新进度用到 运行在UI线程

        @Override

        protected void onProgressUpdate(Integer... values) {

            super.onProgressUpdate(values);

        }





    }



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴帅_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值