Android入门之Handler的使用教程详解

作者:TGITCIC 时间:2022-06-17 04:03:22 

简介

我们在前面的Android教程中已经提到过这么一件事:Android在启动后会有一个主线程。它不允许任何子线程去改变主UI线程里的内容。

这么做是为了妨止,万一有一个带有大事务的线程导致了渲染组件时间过长最终导致Android UI出现“闪退”、“崩溃”的保护机制。

而实际我们在Android操作里的确是会有一些“耗时”的事情而采用异步线程,如:首页打开时调用第三方地图定位API、调用第三方银行API来显示你的余额、调用第三方社保显示你的当前社保缴纳费用和额度。

这种加载我们都会使用异步,一旦异步加载完后拿到结果再“刷新”在我们的主界面的控件里。那么此时由于Android的保护机制就不可以直接在异步线程里一个set()就完事了。

因此Android给我们提供了Handler机制。

Handler我们可以认为它是一个和Android主进程间的通道。

当异步任务、子任务等需要改变主UI线程里的控件的渲染、值、显示用变化,那么我们就通过Handler发一条消息。

当主线程Listener到了消息,然后就可以去做相应的值的改变和渲染了。

Android入门之Handler的使用教程详解

我们为了充分说明这个问题我们用一个ImageView,然后在里面每隔X毫秒,换一个图片从而实现下面这样的一个“动画”效果来说明Android里的Handler的使用方法。

Android入门之Handler的使用教程详解

项目结构

Android入门之Handler的使用教程详解

项目结构很简单,只有8个图,这8个图是8个桢。每X毫秒在原来的图位置上换一个图,然后滚播,以到达“动画”效果。

我把这8桢图给出,供各位自己去练习吧。

Android入门之Handler的使用教程详解

代码

前端

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/RelativeLayout1"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center"
   tools:context="org.mk.android.demohandlerwithanim.MainActivity" >

<ImageView
       android:id="@+id/imgAnimation"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_alignParentTop="true"
       />

</RelativeLayout>

后端

package org.mk.android.demohandlerwithanim;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {
   int imgids[] = new int[]{R.drawable.a_1, R.drawable.a_2, R.drawable.a_3, R.drawable.a_4, R.drawable.a_5, R.drawable.a_6, R.drawable.a_7, R.drawable.a_8};
   int imgstart = 0;
   ImageView imgAnimation;

@Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       imgAnimation = findViewById(R.id.imgAnimation);
       Handler imgAnimationHandler = new ImgAnimatonHandler();
       new Timer().schedule(new TimerTask() {
           @Override
           public void run() {
               imgAnimationHandler.sendEmptyMessage(101);
           }
       }, 0, 100);
   }

class ImgAnimatonHandler extends Handler {
       @Override
       public void handleMessage(Message msg) {
           if (msg.what == 101) {
               imgAnimation.setImageResource(imgids[imgstart++ % 8]);
           }
       }
   }
}

代码导读

我们使用的是ImageView里的setImageResource来轮换图片做到动画效果;

我们使用了Handler,在Handler.handleMessage里来换ImageView里的图;

然后我们使用了一个Timer()的schedule线程,以每100毫秒向Handler发一个emptyMessage(101)这样的一个消息给到Handler的Listener,所以在handleMessage方法中如果what==101就&ldquo;飞&rdquo;。

最终就实现了这样的一个效果了

Android入门之Handler的使用教程详解

来源:https://blog.csdn.net/lifetragedy/article/details/128028900

标签:Android,Handler
0
投稿

猜你喜欢

  • MyBatis批量插入(insert)数据操作

    2023-09-21 00:03:54
  • 零基础写Java知乎爬虫之获取知乎编辑推荐内容

    2023-11-29 04:33:39
  • HashMap的get()方法的NullPointerException问题

    2023-09-23 07:24:12
  • C#将PDF转为多种图像文件格式的方法(Png/Bmp/Emf/Tiff)

    2022-06-29 16:13:03
  • Java客户端调用.NET的WebService实例

    2023-11-03 17:22:00
  • JavaWeb验证码校验功能代码实例

    2022-07-18 23:46:52
  • SpringDataJpa如何使用union多表分页条件查询

    2023-05-16 04:28:49
  • C#利用正则判断输入是否为纯数字、容器类

    2022-10-10 03:00:39
  • Java探索之Feign入门使用详解

    2023-08-18 03:38:06
  • window下安装和配置maven环境

    2021-06-13 14:32:16
  • Java 容器类源码详解 Set

    2022-03-21 18:08:40
  • Swagger注解-@ApiModel和@ApiModelProperty的用法

    2023-02-05 23:57:48
  • Java 数据库连接池详解及简单实例

    2023-08-10 15:54:07
  • add方法理解ArrayList的扩容机制

    2023-11-24 02:16:28
  • 如何用java程序(JSch)运行远程linux主机上的shell脚本

    2023-11-24 12:35:58
  • springboot 注解方式批量插入数据的实现

    2022-02-20 19:03:50
  • C# memcached缓存使用实例代码

    2022-01-15 02:17:11
  • C#中is,as,using关键字的使用说明

    2023-07-01 22:54:42
  • Java5种遍历HashMap数据的写法

    2022-09-27 15:43:27
  • c# 断点续传的实现

    2023-07-01 22:41:02
  • asp之家 软件编程 m.aspxhome.com