点赞处理的一些小技巧

2024-08-24 07:48
文章标签 技巧 处理 点赞

本文主要是介绍点赞处理的一些小技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天来讲一些平时用的小技巧,然后由此引申一些其他的小技巧。

点赞是我们平时业务开发最常接触的,但如何更投巧的去做这块,还需要细细的开动小脑筋,下面会有一些和平时开发的对比,慢慢品味吧

连续点赞网络请求处理

在我们处理点赞业务中,主要处理“赞”图片的翻转和结果的网络请求,按照我们常规操作的话,每一次点击,都会把结果告知服务器,操作伪代码如下:

    boolean zanFlag = false;public void clickZan(View view) {if (zanFlag) {imgZan.setImageResource(R.drawable.zan_normal);} else {imgZan.setImageResource(R.drawable.zan_focus);}zanFlag = !zanFlag;//网络请求操作requestNet();}

这么看似乎是没什么问题,业务处理也是可行的,然后我们在网络请求这个部分做个日志打印,模拟网络请求,然后来看下图:

当我们在开始部分缓慢的进行点赞时,似乎是没有任何问题的,后面我开始疯狂点击,不断的产生网络的请求。假设,如何我疯狂连续点击100次,最终的结果只是“赞了”或是“没赞”,也就是只有2个结果,为了这两个结果,我们需要做100次网络请求,实数浪费。

从产品设计思路来思考,对于连续请求的处理,我们完全可以延时等待用户停止疯狂点击,然后将最后一次的结果作为最终结果再来上传处理,避免了在疯狂点击时频繁请求。

顺着这个思路来思考编码,我们需要一个定时,即在用户点击该按钮时,延时这个定时等待用户是否还会继续点击,如果用户在这个延时内还继续点击,则取消之前的定时,重新发送一个定时,直到用户停止点击了,延时也到了,则在延时到了的回调中去处理网络请求,这样,可以省了很多无用网络请求,接下来,我们开始编码

    Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//网络请求操作requestNet();}};boolean zanFlag = false;private static final int DELAY_MESSAGE = 0x0429;private static final int delayTime = 500;public void clickZan(View view) {if (zanFlag) {imgZan.setImageResource(R.drawable.zan_normal);} else {imgZan.setImageResource(R.drawable.zan_focus);}zanFlag = !zanFlag;handler.removeMessages(DELAY_MESSAGE);handler.sendEmptyMessageDelayed(DELAY_MESSAGE,delayTime);}

这里我使用了handler来做延时的处理,每次点击时,先把handler的 DELAY_MESSAGE 先移除了,然后重新发送延时 DELAY_MESSAGE 消息,延时时间设置了500毫秒,如果在500毫秒内疯狂点击,在handler消息还未到达时,早已通过removeMessage将之前的消息给移除掉了,通过这样的一个小技巧,我们来看看效果:

在我频的繁操作下,也就是最后一次有效,这样避免了之前频繁的无效操作。

通过这个例子,开始延伸,想到了我们平时用到的搜索,接下来讲搜索

实时搜索网络请求

有的业务情况是在EditText中实时搜索,显示网络返回的结果,对于搜索,一般都是给EditText添加TextWatcher监听,在onTextChanged回调中实时获取当前EditText的内容,然后请求网络,这里的问题也是和上面的问题一样,因为在用户输入文本的时候,TextWatcher会实时回调,回调十分频繁,我们只想在用户确认搜索结果时,用户不在继续输入了,然后再去请求网络,这里的处理也是和上面一样,通过延时的方式来解决频繁的操作。
伪代码

 editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {handler.removeMessages(DELAY_MESSAGE);Message msg = handler.obtainMessage();msg.what = DELAY_MESSAGE;msg.obj = s.toString();handler.sendMessageDelayed(msg, delayTime);}@Overridepublic void afterTextChanged(Editable s) {}});Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);//网络请求操作Log.e("TAG", "editText : " + msg.obj);}};

效果如下,还是十分的nice的


由于点赞部分,又让我想起了点赞动画的处理,这个地方参考了该篇博文的思路使用Glide V4 实现GIF点赞动画 , 他的思路比较巧妙,也是我觉得特别喜欢的一个地方,下面我来说下思路:

1、通过view点击的位置,获取view当前所在屏幕位置的坐标

 int arr[] = new int[2];view.getLocationInWindow(arr);

2、获取Decorview,创建个一样的view,add到Decorview上

        View decorView = getWindow().getDecorView();if (decorView instanceof FrameLayout) {frameLayout = (FrameLayout) decorView;}ImageView imageView = new ImageView(this);imageView.setImageResource(resInt);FrameLayout.LayoutParams layoutParams =new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);//获取位置拿到的坐标是控件左上角的位置,采用margin的方式来定位控件在decorview中的位置layoutParams.leftMargin = arr[0];layoutParams.topMargin = arr[1];layoutParams.width = 100;layoutParams.height = 100;imageView.setLayoutParams(layoutParams);frameLayout.addView(imageView);

3、将添加到Decorview的view做动画,监听动画结束时移除该view

   set.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {ViewGroup parent = (ViewGroup) view.getParent();if (parent != null) {parent.removeView(view);}}@Overridepublic void onAnimationRepeat(Animation animation) {}});

具体代码就不贴了,大家可以看原链接,下面贴一张我做的图

动画主要就是一个透明+缩放的一个AnimationSet

这篇关于点赞处理的一些小技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101883

相关文章

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序