移动技术开发:HandlerAsyncTask

news2024/12/28 20:52:07

1 实验名称

       Handler&AsyncTask

2 实验目的

       掌握使用Handler消息传递机制和AsyncTask处理后台线程周期性的改变Activity中界面控件的属性

3 实验源代码

布局文件代码:

(1)HandlerTest

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/constraintlayout"
    >
</androidx.constraintlayout.widget.ConstraintLayout>

(2)AsyncTask

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    >

    <Button
        android:id="@+id/downLoadBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始下载"
        />

    <TextView
        android:id="@+id/resultTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        />

    <ProgressBar
        android:id="@+id/downLoadPb"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        style="?android:attr/progressBarStyleHorizontal"
        android:max="100"
        />

</LinearLayout>

Java代码:

(1)HandlerTest

package com.example.handlertest2;

import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {

    private ConstraintLayout constraintLayout = null;
    private Handler handler = null;
    private int [] colors = {Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW,Color.MAGENTA};
    private int currentIndex = 0;//当前颜色的下标

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        constraintLayout = findViewById(R.id.constraintlayout);
        handler = new Handler(){
            @Override
            public void handleMessage(@NonNull Message msg) {
                if (msg.what == 0x11){
                    currentIndex = (currentIndex+1)%colors.length;
                    constraintLayout.setBackgroundColor(colors[currentIndex]);
                }
            }
        };start();

    }
    private void start(){
        //创建一个每隔3秒钟就发送一个what值为0x11消息的子线程并运行起来
        new Thread(){
            @Override
            public void run() {
                while (true){
                    try {
                        Thread.sleep(3000);
                        handler.sendEmptyMessage(0x11);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }.start();
    }
}

(2)AsyncTask

package com.example.asynctasktest;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {
    private Button downLoadBtn = null;
    private TextView resultTv = null;
    private ProgressBar downLoadPb = null;
    //定义一个异步任务类的对象
    private DownLoadAsyncTask downLoadAsyncTask = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        downLoadBtn = findViewById(R.id.downLoadBtn);
        resultTv = findViewById(R.id.resultTv);
        downLoadPb = findViewById(R.id.downLoadPb);

        downLoadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建模拟下载的异步任务类的对象,调用带参数的构造方法获取到MainActivity中的三个控件的引用
                downLoadAsyncTask = new DownLoadAsyncTask(downLoadBtn,resultTv,downLoadPb);
                //启动模拟下载的异步任务
                downLoadAsyncTask.execute(500);
            }
        });

    }
}

(3)DownLoadAsyncTask

package com.example.asynctasktest;

import android.graphics.Color;
import android.os.AsyncTask;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class DownLoadAsyncTask extends AsyncTask<Integer,Integer,String> {

    private Button downLoadBtn = null;
    private TextView resultTv = null;
    private ProgressBar downLoadPb = null;

    public DownLoadAsyncTask(Button downLoadBtn, TextView resultTv, ProgressBar downLoadPb) {
        this.downLoadBtn = downLoadBtn;
        this.resultTv = resultTv;
        this.downLoadPb = downLoadPb;
    }

    @Override
    protected void onPreExecute() {
        downLoadBtn.setText("正在下载中。。。");
        downLoadBtn.setEnabled(false);//将按钮设置为不可用

        resultTv.setVisibility(View.VISIBLE);//将文本框可见
        resultTv.setTextSize(24);
        resultTv.setTextColor(Color.BLUE);

        downLoadPb.setVisibility(View.VISIBLE);//将进度条可见
    }

    @Override
    protected String doInBackground(Integer... integers) {
        //模拟下载,每隔一个时间下载1%
        for (int i=0;i<101;i++){
            try {
                Thread.sleep(integers[0]);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            publishProgress(i);//发布异步任务的进度
        }
        return "下载完毕";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        downLoadPb.setProgress(values[0]);//将publishProgress(i)方法中的i值设置为进度条的当前进度值
        resultTv.setText("当前完成了任务的"+values[0]+"%");
    }

    @Override
    protected void onPostExecute(String s) {
        resultTv.setText(s);
        downLoadBtn.setText("重新下载");
        downLoadBtn.setEnabled(true);
    }
}

4 实验运行结果图

5 实验总结

       对于HandlerTest,保留文件初始布局文件,直接开始写Java代码。定义当前颜色的小标,创建一个每隔三秒钟就发送一个what值为0x11消息的子线程并运行起来。

       对于AsyncTask,先写布局文件,再写Java代码。界面布局比较简洁,包括了一个下载按钮,一个文本框和一个下载进度条。

       实现下载的过程中,先定义一个异步任务类的对象,然后创建模拟下载的异步任务类的对象,调用带参数的构造方法获取到三个控件的引用,最后启动模拟下载的异步任务;模拟下载过程中,设置每隔一个时间下载1%。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2168473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深度学习》—— ResNet 残差神经网络

文章目录 一、什么是ResNet&#xff1f;二、残差结构&#xff08;Residual Structure&#xff09;三、Batch Normalization&#xff08;BN----批归一化&#xff09; 一、什么是ResNet&#xff1f; ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出&#xff0c;斩获…

文新智能体开发:省钱有道,智慧选择,属于你的“省钱小诸葛”

开发灵感 在开发购物类智能体“省购小诸葛”时&#xff0c;我的灵感源自于对现代消费者购物行为的深刻洞察与未来科技趋势的展望。想象一个时代&#xff0c;当信息的海洋变得浩瀚无垠&#xff0c;消费者在众多商品与促销活动中遨游&#xff0c;却往往感到迷茫与疲惫。这时&…

在CANoe/CANalyzer中Replay Block“一键发送”一个诊断/命令序列

案例背景&#xff1a; 在博文《在CANoeCANalyzer中“在线回放”CAN Log.asc/blf文件_canoe怎么回放blf文件-CSDN博客https://blog.csdn.net/qfmzhu/article/details/128954931》我们介绍了Replay Block模块的一些典型应用。 下面我们介绍如何使用Replay Block代替IG(Interact…

OJ在线评测系统 后端 使用代理模式编写测试类 并 实现核心业务判题流程

编写测试类(代理模式) 实现示例的代码沙箱 package com.dduo.dduoj.judge.codesandbox.impl;import com.dduo.dduoj.judge.codesandbox.CodeSandbox; import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeRequest; import com.dduo.dduoj.judge.codesandbox.model.Exec…

Linux 冯诺依曼体系结构与操作系统概念

目录 0.前言 1. 冯诺依曼体系结构概述 1.1 输入单元 1.2 中央处理单元&#xff08;CPU&#xff09; 1.3 输出单元 2. 冯诺依曼体系结构的关键特性 2.1 所有数据流向内存 2.2 数据流动示例&#xff1a;QQ聊天过程 3. 操作系统 3.1 概念 3.2 设计操作系统的目的 3.3 操作系统的“…

华为源NAT技术与目的NAT技术

1&#xff09;源NAT对报文源地址进行转换&#xff0c;分为NAT NO-PAT&#xff0c;NAPT,EASY-IP,三元组NAT&#xff1b; &#xff08;1&#xff09;NAT NO-PAT原理&#xff1a; no-port address translation:非端口地址转换&#xff1a;只转换地址&#xff0c;不转换端口&…

【C++位图】构建灵活的空间效率工具

目录 位图位图的基本概念如何用位图表示数据位图的基本操作setresettest 封装位图的设计 总结 在计算机科学中&#xff0c;位图&#xff08;Bitmap&#xff09;是一种高效的空间管理数据结构&#xff0c;广泛应用于各种场景&#xff0c;如集合操作、图像处理和资源管理。与传统…

使用docker形式部署prometheus+alertmanager+钉钉告警

一、拉取所需要的镜像 docker pull prom/node-exporter docker pull grafana/grafana docker pull prom/prometheus docker pull prom/alertmanager 其中 prom/node-exporter&#xff1a;用于收集主机系统信息和指标的 grafana/grafana&#xff1a;是一个用于可视化和分…

word2vector理论

目录 1.理论 2.公式 3.SkipGram的优化 1.理论 2.公式 3.SkipGram的优化 CBOW的优化, CBOW是用上下文预测中心词. Hirarchical softmax帮助我们最快的找到最大的softmax, 通过建立一个霍夫曼树.

【数据结构】AVL树相关知识详细梳理

1. AVL树的概念 AVL的全称是Adelson-Velsky-Landis&#xff0c;其名称来源于其发明者Adelson、Velsky和Landis&#xff0c; 是平衡二叉树搜索树。 它的出现是由于二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找…

城市轨道交通网络客流大数据可视化分析系统----以某市交通网络客流数据为例

1 引言 1.1研究背景、目的与意义 1.1.1研究背景 城市轨道交通系统是现代城市的重要交通方式之一&#xff0c;随着城市化进程的加速和人口增长&#xff0c;轨道交通系统的客流量不断增加。因此&#xff0c;轨道交通部门和相关企业需要对客流数据进行实时监测和分析&#xff0…

云数据库RDS MySQL性能测试与对比@2024年09月

原创&#xff1a;orczhouninedata 来源&#xff1a;云数据库技术 在不同的云厂商购买相同规格的MySQL实例(如4vCPU-16GB)&#xff0c;获得的性能相同吗&#xff0c;他们的差异如何&#xff1f;本文继续尝试回答这个问题。 详细数据&#xff1a; 测试结果概述 在本次测试中&…

常见的TTL,RS232,RS485,IIC,SPI,UART之间的联系和区别

简单总结 图片来源 RS232,RS485可参考&#xff0c;IIC&#xff0c;SPI,UART可参考 烧录程序中常听到的一句话就是USB转TTL&#xff0c;但严格来说算是USB传输数据的协议转换成TTL&#xff08;Transistor-Transistor Logic&#xff09;协议传输数据。首先&#xff0c;usb是常见…

电脑资料被拷贝了,能查出来吗?5个方法有效防止电脑泄密!

网络快速发展的背景下&#xff0c;电脑资料的安全问题日益凸显。 一旦电脑资料被非法拷贝&#xff0c;不仅可能导致企业核心机密泄露&#xff0c;还可能对个人隐私造成严重影响。 那么&#xff0c;当电脑资料被拷贝时&#xff0c;我们能否查出来&#xff1f;又该如何有效防止…

【Python】必学!教你如何在日志中隐藏明文密码?看完包会的!(附带免费源码)

前言 在项目开发中&#xff0c;有的时候会遇到一些安全需求&#xff0c;用以提升程序整体的安全性&#xff0c;提高外来非法攻击的门槛&#xff0c;而在日志中隐藏明文密码打印便是最典型的安全需求之一。 在Python中&#xff0c;明文密码往往发生于命令执行参数、debug日志、…

施耐德EcoStruxure Machine SCADA Expert(EMSE)数据监测(十八)

通过EMSE与sql数据库连接,可以实现一些过程数据的监测、存档,实现生产过程的可视化。 1.创建sql数据库表单 新建一个名为Table_Monitor的表单,添加三个元素:Re_Index 序号;Re_Date 时间;Re_Temper 温度(需要监测的数据) 2.EMSE内关联变量 2.1 先创建网格 2.2 选择数据…

unity CustomEditor的基本使用

CustomEditor用来自定义脚本的编辑面板 其基本使用方式 先准备一个类&#xff0c;继承MonoBehaviour 定义一个变量&#xff0c;然后准备一个类&#xff0c;继承自Editor 在CustomEditor中指定要去修改的类型&#xff0c;通过serializedObject.FindProperty(变量名)的方式来获…

Ubuntu下安装向日葵:闪退

下载 https://sunlogin.oray.com/download 初次安装 $ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 正在选中未选择的软件包 sunloginclient。 (正在读取数据库 ... 系统当前共安装有 234281 个文件和目录。) 准备解压 SunloginClient_15.2.0.63064_amd64.deb ..…

Java.动态代理

1.创建一个接口 package Mydynamicproxy1;public interface Star {public abstract String sing(String str);public abstract void dance(String str); }2.创建一个BigStar类&#xff0c;要实现Star这个接口 package Mydynamicproxy1;public class BigStar implements Star{…

甘肃非遗文化网站:Spring Boot开发实战

3 系统分析 当用户确定开发一款程序时&#xff0c;是需要遵循下面的顺序进行工作&#xff0c;概括为&#xff1a;系统分析–>系统设计–>系统开发–>系统测试&#xff0c;无论这个过程是否有变更或者迭代&#xff0c;都是按照这样的顺序开展工作的。系统分析就是分析系…