自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(106)
  • 收藏
  • 关注

原创 说一说Kotlin协程中的同步锁——Mutex

在多线程并发的情况下会很容易出现同步问题,这时候就需要使用各种锁来避免这些问题,在java开发中,最常用的就是使用synchronized。kotlin的协程也会遇到这样的问题,因为在协程线程池中会同时存在多个运行的Worker,每一个Worker都是一个线程,这样也会有并发问题。虽然kotlin中也可以使用synchronized,但是有很大的问题。因为synchronized当获取不到锁的时候,会阻塞线程,这样这个线程一段时间内就无法处理其他任务,这不符合协程的思想。

2024-05-04 09:30:00 2005

原创 深入理解Flutter中的Mixin机制

通过上面的详细分析,我们可以很清楚的理解了Mixin的机制,它实际上是在编译的时候为类添加了一系列继承关系来实现混入。虽然上面是在Web端实验的,但是在Android端测试也是同样的情况,处理上应该也是类似的,同理其他端如ios应该也一样。关注公众号:BennuCTech,获取更多干货!

2024-02-05 15:32:55 1442

原创 【玩转Electron】超详细的使用教程

ElectronElectron是什么,我们先看看官方https://www.electronjs.org/ 的介绍如何说的What is Electron?Electron is a framework for building desktop applications using JavaScript, HTML, and CSS. By embedding Chromium and Node.js into its binary, Electron allows you to maintain

2023-02-08 10:15:38 3338

原创 【Android开发】事件是如何分发到Activity的?

前言Android事件分发机制大家都非常熟悉,大部分文章对这个过程的描述都是开始于Activity,但是事件是怎么传到Activity的?这里就涉及到几个重要的部分:Window,WMS,ViewRoot和DecorView。如果要理解事件分发的源头,就需要搞明白他们之间的关系,所以我们先来看看它们到底有什么关系?WindowWindow是我们比较熟悉的,那么它是如何创建的?我们来看Activity的attach函数:@UnsupportedAppUsagefinal void attach

2021-12-03 09:14:00 657

原创 详细解读Android中的事件分发机制

前言Android的事件分发机制也是老生常谈了,这篇文章并不是笼统的介绍这个机制,而是针对ACTION_DOWN这个事件探讨相关的细节。dispatchTouchEvent说到Android事件分发,一定绕不开dispatchTouchEvent函数,View和ViewGroup的该函数有很大的不同。我们来看看ViewGroup的dispatchTouchEvent函数,它的部分源码如下:@Overridepublic boolean dispatchTouchEvent(MotionEvent

2021-11-19 15:51:36 2250

原创 详细解读RecyclerView的局部刷新机制

前言这篇文章其实之前就完成了,一直遗忘在角落里了,今天无意翻之前的笔记发现的,大部分内容应该还是有效的。之前在使用RecyclerView的遇到过一个问题,使用notifyItemChanged刷新数据的时候会出现重影或者闪烁的现象。这个问题很容易出现,当我们的列表中有进度显示(比如下载),这时候需要不停的更新进度,就需要使用notifyItemChanged使用notifyItemChanged可以只刷新那一个item,这样就避免了像ListView那样全部刷新但是如果使用notifyItemC

2021-10-29 17:21:17 2465

原创 [AIGC][Dify开发]添加并实现新的模型

这里我们是对dify已有的模型供应商添加新分类和新模型,所以有不少现成的工具来使用。如果要添加一个全新的模型供应商,会稍微更复杂一点,但是其实原理差不多,其实就是实现模型的请求。另外,百度文心的rerank模型我已经提交pr给dify官方了,目前已经merge了,估计在下个版本就可以直接使用了。

2024-10-23 11:16:08 758

原创 【Android开发】如何打包压缩文件、文件夹?

在开发Android应用过程中,基本都会遇到需要压缩文件的需求,比如打包日志文件上传等功能,今天就来看看如何开发一个通用的工具类用于压缩文件或文件夹。这样我们就可以打包压缩文件或文件夹了,为了方便可以封装成一个工具类,方便以后使用。我自己整理了一个工具类,大家有需要可以关注微信公众号“BennuCTech”,发送“ZipFile”获取完整代码。

2024-08-03 09:30:00 915

原创 如何自定义TabLayout样式

前言在Android开发中经常会遇到tab页面,这样就需要tab+viewpager的方式来进行处理。谷歌官方提供了TabLayout,但是我们发现很多项目并不愿意使用,主要原因就是样式处理不够灵活。当然TabLayout可以自己实现TabItem,这样就可以满足大部分需求。但是其实使用默认的TabItem也可以实现很多样式,我们可以使用一些巧妙的方法来达到我们需要的效果,比如:下面我们就看如何一步步实现上面的效果改变字体颜色、大小这个很简单,xml中直接设置即可:app:tabTextCol

2023-12-18 14:14:50 1798

原创 如何延迟Fragment的导航过渡

前言做应用提高用户体验是很关键的,对于用户体验来说有一件事是不能回避的,就是页面切换的过渡动画。因为后一个页面可能会加载数据,所以切换时后一个页面是空白的导致用户体验比较差。那么如果下一个页面数据加载可能很快,为了提供流畅的顶级导航过渡,可不可以等待第二个屏幕加载数据,然后再启动动画?Android中的Fragment就提供了这种功能,通过它可以推迟fragment的载入,这样在界面通过动画过渡到第二个屏幕之前,第二个屏幕上的界面元素(通常是从网络获取的图片)已做好显示准备。这便是:postponeEn

2023-09-19 10:12:48 212

原创 横竖屏切换导致页面频繁重启?详细解读screenLayout

前几天多名用户反馈同一个问题,在小新平板上无法上网课,点击上课按钮后就退回到首页了。同事了解了一下发现小新平板现在销量特别好,于是赶紧申请了一台测试机打算看看到底是什么问题。

2023-06-16 15:26:34 985

原创 【Flutter混合开发】开发一个简单的快速启动框架

因为在移动端中启动Flutter页面会有短暂空白,虽然官方提供了引擎预热机制,但是需要提前将所有页面都进行预热,这样开发成本较高,在研究了闲鱼的FlutterBoost插件后,我看看能不能自己实现一个简单的快速启动框架。这篇文章用到的知识点都在《flutter混合开发:native与flutter交互》中详细讲解了,大家可以先读一下这篇文章再来看本文。本文不再赘述这些内容,直接上干货。

2023-06-06 10:47:59 456

原创 Android 如何获取有效的DeviceId

Android 10上的DeviceId从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。而这个权限是系统权限,也就是说一般应用将无法再获取IMEI 和序列号

2023-05-19 16:51:49 5921 2

原创 【Flutter混合开发】在Android项目中如何启动Flutter

flutter可以独立完成项目,但是在现有项目情况下最好的方式就是混合开发,逐步过渡。这样就会共存native和flutter代码,而其中最关键的就是native如何启动flutter页面,及flutter与native如何交互。本文以Android为例,展示如何在一个现有项目中引入flutter、启动flutter,如何加速启动以及如何传参。

2023-05-18 17:00:29 1017

原创 【Flutter开发】Navigator2.0介绍及使用

Navigator1.0是通过Navigator来管理处理路由,而Navigator2.0则是通过Router来处理的,但是也需要Navigator,实际上是用Router对Navigator包裹起来。Router相对来说功能就强大很多了,同时使用起来也复杂很多。

2023-05-18 16:56:17 1266 1

原创 【Android Jetpack】新一代导航管理——Navigation

不知道小伙伴们是否注意到,用AS创建一个默认的新项目后,MainActivity已经有了很大的不同,最大的区别就是新增加了两个Fragment,同时我们注意到这两个Fragment之间跳转的时候并没有使用之前FragmentTransaction这种形式,而是使用了NavController和NavHostFragment,这就是新一代导航管理————Navigation。

2023-05-16 16:14:27 884

原创 Android Jetpack:利用Palette进行图片取色

与产品MM那些事新来一个产品MM,因为比较平,我们就叫她A妹吧。A妹来第一天就指出:页面顶部的Banner广告位的背景是白色的,太单调啦,人家不喜欢啦,需要根据广告图片的内容自动切换背景颜色,颜色要与广告图主色调一致。作为一名合格的码农我直接回绝了,我说咱们的应用主打简洁,整这花里胡哨的干嘛,劳民伤财。A妹也没放弃,与我深入交流了一夜成功说服了我。其实要实现这个需求也不难,Google已经为我们提供了一个方便的工具————Palette。

2023-05-04 16:00:29 1197

原创 详谈Android进程间的大数据通信机制:LocalSocket

说起Android进行间通信,大家第一时间会想到AIDL,但是由于Binder机制的限制,AIDL无法传输超大数据。那么我们如何在进程间传输大数据呢?Android中给我们提供了另外一个机制:LocalSocket

2023-04-27 16:24:15 1524

原创 【Flutter进阶】聊一聊组件中的生命周期、状态管理及局部重绘

说到生命周期,熟悉Android开发的小伙伴一定第一时间会想到Activity的生命周期,由于在Flutter中一切都是组件,所以组件的生命周期其实是类似的。在这个过程中组件的状态——State就非常重要,它记录这整个组件内可变部分的状态,当状态发生改变时就需要刷新组件以显示最新的状态。当然,如果组件比较复杂的时候,其中一个状态改变就导致整个组件的刷新是不可取的,这就涉及到Flutter中的局部重绘即局部刷新的机制。

2023-04-13 16:00:44 773

原创 来详细的聊一聊Android Apk的四代签名

大部分开发者对apk签名还停留在APK v2,对APK v3和APK v4了解很少,而且网上大部分文章讲解的含糊不清,所以根据官网文档重新整理一份。apk签名从APK v1到APK v2改动很大,是颠覆性的,而APK v3只是对APK v2的一次升级,APK v4则是一个补充。

2023-04-13 15:07:53 942

原创 【Android开发】App Bundle技术之动态功能模块

本文并不是介绍Android App Bundle,因为它不是新的事物,相关的文章也有很多了,本文重点介绍的是Android App Bundle中“动态功能模块”的实际应用。

2023-04-12 16:59:36 1580

原创 【Jetpack】ActivityResult介绍及原理分析

ActivityResult是Jetpack提供的一个功能,可以简化Activity直接的数据传递(包括权限申请)。它通过提供类型安全的 contract (协定) 来简化处理来自 Activity 的数据。这些协定为一些常见操作 (比如: 拍照或请求权限) 定义了预期的输入和输出类型,除此之外您还能够自定义协定来满足不同场景的需求。

2023-04-12 16:16:37 1249

原创 【Flutter开发】如何捕获处理Error

Flutter 框架可以捕获运行期间的错误,包括构建期间、布局期间和绘制期间。所有 Flutter 的错误均会被回调方法 FlutterError.onError 捕获。默认情况下,会调用 FlutterError.dumpErrorToConsole 方法,正如方法名表示的那样,将错误转储到当前的设备日志中。当从 IDE 运行应用时,检查器重写了该方法,错误也被发送到 IDE 的控制台,可以在控制台中检查出错的对象。

2023-04-04 17:34:53 779

原创 Mac和Linux安装Mongodb教程

前言在mongodb的官网中有mac环境的安装配置说明https://docs.mongodb.com/master/tutorial/install-mongodb-on-os-x/?_ga=1.195394860.1870401707.1469257907在mac上安装mongodb有两种方式:(1)使用Homebrew来安装,如果电脑中有Homebrew,安装起来就比较简单,如果没有可以安装一个,以后也用的到。(2)如果电脑没有Homebrew且不想安装,那么直接用压缩包的形式安装也可。我

2023-03-24 10:25:40 9181 4

原创 【Flutter进阶】与Native进行交互的三种方式

上面我们展示了三种交互方式的使用,并解析了其内部的联系。其实可以看到三种方式最终其实都是使用了BinaryMessenger这一抽象类的默认实现_DefaultBinaryMessenger。所以如果我们通过BinaryMessenger来实现一套自己特别的消息传递机制。

2023-02-16 16:14:24 1461

原创 【Flutter进阶】 Web开发中如何加载网络图片

通过上面一系列折腾大家应该也能看出来,目前Flutter对Web开发的支持还是不够的,很多功能还没有完善。如果各位同学想使用Flutter进行Web开发就需要慎重考虑,我建议至少等Google对这部分进行完善,迭代几个正式版本后再尝试。

2023-02-10 10:31:42 1397

原创 如何在Electron中实现一个简易的更新功能?

官方其实已经提供了几种很便捷的方案:https://www.electronjs.org/docs/tutorial/updates但是不是需要github,就是需要搭建一个服务端,因为我们的场景很小,electron只是一个壳,所以更新的需求不强烈,只是一个以防万一的功能,所以我们想寻求一个简单的方式来处理。autoUpdater我们用electron-forge进行打包,其实这就自带了更新功能,即autoUpdater。使用也很简单只需要几步,如下:const { autoUpdater } =

2023-02-07 15:42:45 2065

原创 Android 13发布,一起来看看有哪些新功能

目前Google已经发布了Android13的正式版,虽然国内的手机能用上Android13还有一段时间,不过开发者们可以通过模拟器来体验,那么我们来看看Android13都有哪些重要的改变,我们适配的话需要做哪些工作?

2022-11-01 10:06:50 2008

原创 【Flutter混合开发】在已有iOS项目中引入Flutter

前言在android项目中添加flutter模块比较简单,因为毕竟都是google的,但是在ios中添加flutter模块有些麻烦了,我们首先参考的是官方文档https://flutter.cn/docs/development/add-to-app/ios/project-setup但是在实际过程中会遇到各种问题(当然我本身对ios开发不熟悉也造成了不小的困扰),这里结合官方的步骤和我的经验来说说整个接入过程和遇到的坑。我的环境是Android Studio 4.0.1 + Xcode12.4 +

2022-06-02 10:16:02 5533

原创 Flutter Web中刷新与后退问题

前言使用flutter开发web页面,在pc端使用就会面临刷新的问题。尤其是刷新时,本地变量清空导致页面问题,所以就需要考虑全局缓存的问题。刷新正常情况下,我们通过Navigator来进行页面切换:Navigator.of(context).pushNamed(String routeName, {Object? arguments,});通过这种方式可以传参,然后在新的页面可以通过ModalRoute.of(context).settings.arguments获取传参并使用。但是如果是we

2022-04-12 09:38:57 2880

原创 【Android】实现一个悬浮在软键盘上的输入栏

前言我们要实现一个悬浮在软键盘上的输入栏(即一个悬浮栏),过程中遇到了很多问题,查阅了一个网上的文章,结果发现不少是错误的,走了一些弯路,这里就一一记录一下。悬浮栏实现悬浮栏很简单chatInputPanel.setVisibility(View.VISIBLE);chatInputEt.setFocusable(true);chatInputEt.setFocusableInTouchMode(true);chatInputEt.requestFocus();InputMethodMana

2022-04-06 10:48:58 4069 11

原创 【Flutter开发】如何创建一个Flutter项目

搭建flutter环境这一步很简单,根据官网提示一步步进行就可以。官方地址:https://flutterchina.club/get-started/install/重点说一下官网表述不准确和搭建过程中发生的问题,我是基于mac环境安装的。The Flutter directory is not a clone of the GitHub project运行flutter doctor报如下错误:Error: The Flutter directory is not a clone of th

2022-02-17 08:53:06 2312

原创 Android 12:SplashScreen源码分析

前言在上一篇文章Android 12 新功能:SplashScreen优化启动体验中我们介绍了Android 12上的一个新功能SplashScreen,同时提到了Google为了兼容低版本也提供了Androidx SplashScreen compat库,但是我们在使用的过程中发现这个库在Android 12和12以下版本表现并不一致,今天我们就从源码来分析一下实现细节。SplashScreenViewProviderAndroidx SplashScreen compat库的代码其实很少,只有两个

2022-02-08 09:52:47 1698

原创 Android 12新功能:启动画面SplashScreen

前言由于很多应用在启动时需要进行一些初始化事务,导致在启动应用时有一定的空白延迟,在之前我们一般的做法是通过替换 android:windowBackground 的自定义主题,使应用启动时及时显示一张默认图片来改善启动体验。在Android 12中,官方添加了SplashScreen API,它可为所有应用启用新的应用启动界面。新的启动界面是瞬时显示的,所以就不必再自定义android:windowBackground 了。新启动页面的样式默认是正中显示应用图标,但是允许我们自定义,以便应用能够保持其

2022-01-24 09:25:30 13644

原创 【Swift开发】SwiftUI中使用MapKit实现地图功能

前言ios中可以直接使用苹果官方提供的map——MapKit。在SwiftUI中如何使用MapKit网上有也有不少文章,但是大部分不详细,大部分只是简单的展示出地图。所以本文来详细的讲解一下如何使用MapKit的各项功能。官方地址:https://developer.apple.com/documentation/mapkit1、Map在SwiftUI中可以直接使用Map组件,如下:import SwiftUIimport MapKitstruct ContentView: View {

2022-01-20 08:58:43 2158 1

原创 【Android开发】Drawable标签总结大全

前言我们在drawable目录下可以创建很多自定义的资源,其中用的最多的应该就是selector和shape。目前在Android中有21种drawable标签,了解和利用这些标签对我们的开发有很大的帮助。这个文章我们对这21种标签做一个介绍,让大家有一个印象:shape这个大家非常熟悉,简单列举一下属性和子标签,至于子标签的属性和具体使用就不细说了,网上有的是自身属性android:dither 是否启动图片抖动android:shape 形状。分别为矩形、线、椭圆、环。默认为矩形recta

2021-12-20 10:05:38 3154

原创 什么事RSA算法?原理是什么?

前言RSA算法是最重要的算法之一,它是一种非对称加密,是目前最有影响力的加密方式之一。这篇文章我们通过实现一种简单的RSA加密来探究它的原理。计算公钥和私钥RSA中的公钥和私钥需要结合在一起工作。公钥用来对数据块加密,之后 ,只有对应的私钥才能用来解密。生成密钥时,需要遵循几个步骤以确保公钥和私钥的这种关系能够正常工作。这些步骤也确保没有实际方法能够从一个密钥推出另一个。开始前,首先要选择两个大的素数,记为p和q。根据当今求解大数因子的技术水平,这两个数应该至少有200位,这们在实践中才可以认为是安

2021-12-17 09:57:06 11968

原创 剖析LRU实现和Glide中缓存机制

前言glide的内存缓存有两级:LruCache、ActiveResources其中LruCache老生常谈了,这里就不细说了。ActiveResources实际上内含一个HashMap,Map中value则是资源的弱引用。那么这两级是如何工作的?取出先从LruCache取,没有再从ActiveResources取如果LruCache中有,则取出存入ActiveResources,并从LruCache移除代码如下:public class Engine implements EngineJ

2021-11-30 09:18:02 1132

原创 WebRtc中是如何处理视频数据的?

前言本文是基于PineAppRtc开源项目https://github.com/thfhongfeng/PineAppRtc因为一个需求,我们需要将一个视频流通过WebRtc发送出去,所以就研究一下WebRtc是如何采集视频数据并进行处理发送的,于是有了这篇文章。采集发送在使用webrtc进行即时通话时,双方连接上后,会根据参数创建一个PeerConnection连接对象,具体代码在PeerConnectionClient类中,这个是需要自己来实现的。这个连接的作用来进行推拉流的。然后创建一个Me

2021-11-26 09:09:59 2720 4

原创 webrtc中是如何处理音频数据的?

前言本文是基于PineAppRtc项目https://github.com/thfhongfeng/PineAppRtc)在webrtc中音频的录制和播放都是封装在内部,一般情况下我们也不需要关注,直接使用即可。但是最近有一个需求,需要将我们自己的数据进行传输,所以就需要将这些接口暴露出来使用。所以就需要去研究一下它的源码,就有了这篇文章。音频引擎在webrtc中其实是有不只一套音频引擎的,其中有native层的使用OpenSL ES实现的,另外还有一套java层通过android api实现的。

2021-11-25 09:15:17 2287 9

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除