- 博客(44)
- 资源 (2)
- 收藏
- 关注
原创 Flutter中使用retrofit和dio库实现网络请求
其中@JsonSerializable()注解和part ‘login_by_password_request.g.dart’;都是必需的,此时打开Terminal窗口,运行flutter pub run build_runner build命令,即可生成对应的.g文件,.g文件中自动完成了序列化和反序列化。其中result即为最终的返回数据,数据格式如下所示。
2025-02-20 19:08:18
828
原创 FlutterAssetsGenerator插件的使用
点击images文件夹,鼠标右键点击Flutter:Configuring Paths,pubspec.yaml里自动生成图片依赖路径。在Plugins中找到FlutterAssetsGenerator插件,点击安装。在根目录下创建assets/images文件夹,用于存储图片。使用快捷键Alt + G 生成图片索引文件r.dart。更改生成的资源索引类可以修改名字。在需要的地方直接引用即可。
2025-02-20 19:06:20
362
原创 安卓代码自动提示功能失效记录
打开File -> Settings -> Editor -> General -> Code Completion,将Show suggestions as you type勾上即可。最近在使用体验过各类AI插件后,发现原有的代码自动提示功能失效。即原本只需打出部分字符,可以弹出所有可供选择的,如下所示。点击Ok后再次尝试,原有的代码提示就有了。其中淡灰色为AI插件提示的,下面的选择栏为studio自动提示的。
2025-02-11 13:20:58
215
原创 Flutter使用gen_l10n实现多语言支持
在MaterialApp或GetMaterialApp配置国际化支持。打开Terminal窗口,运行flutter gen-l10n命令。亦可实现一个公共方法,各个地方的调用均使用公共方法。7. 在需要使用的地方直接调用即可。运行后生成的文件目录如下。
2025-02-11 13:20:39
1485
原创 安卓使用Gitee搭建远程Maven仓
上一期讲到了Maven仓的本地实现,但实际开发过程中,使用本地仓进行合作开发是不现实的,这时,我们可以考虑使用第三方的代码管理工具去实现,例如Gitee。但是Gitee 并不是专门的 Maven 仓库管理工具,因此在使用上可能会有一些限制,并不能自动完成一个Maven仓,我们可以将本地构建的Maven项目代码上传到 Gitee 指定文件夹中,确保 pom.xml 文件正确配置了项目的基本信息和依赖即可。在项目的根目录下创建一个maven文件夹,用于存储后续生成的依赖文件。生成的文件结构如下图所示。
2025-01-21 17:39:47
1034
原创 安卓本地Maven仓的实现
在一个新的安卓应用项目project下的build.gradle文件中(新版是在settings.gradle中),引入本地maven仓。若你的Studio中没有,可能是未打开相应的开关,找到Settings中Experimenta,将如下图所示勾上即可。将生成的文件复制到一个方便的目录下,任意都可。之后点击Sync Now即可拉取对应的aar包了,在Gradle包中可以找到对应的包。在一切准备完成后,双击publish,成功后即可生成maven仓所有的所有文件。生成的文件结构如下图所示。
2025-01-21 17:39:30
618
原创 Android平台签名证书的生成
其中D:\work\new\test\TCDH_Partner.keystore表示旧文件,D:\work\new\test\TCDH_Partner.jks表示目标文件。执行后输入新口令和旧口令即可。D:\work\new\test\TCDH_Partner.keystore是证书文件路径,可修改为自己想设置的文件名称,也可以指定完整文件路径。partner是证书别名,可修改为自己想设置的字符,建议使用英文字母和数字。36500是证书的有效期,表示100年有效期,单位天。
2025-01-13 10:00:09
416
原创 Flutter中BLE蓝牙通讯的实现
之前用java写过安卓端的BLE蓝牙通讯测试的demo,最近学习了Flutter相关知识,准备以BLE蓝牙测试为例,写一个flutte的BLE蓝牙测试demo。① 创建一个HomeController来管理页面数据以及蓝牙的实际连接、通讯等。② 在ios下的Info.plist文件中添加ios设备所需权限。① 创建一个蓝牙管理类来管理连接的扫描、连接、通讯等。① 创建一个页面来展示蓝牙的连接和通讯状况。② 创建一个页面来实现蓝牙的扫描和连接。③ 在蓝牙扫描时调用权限检测。③ 统一管理蓝牙的UUID。
2025-01-13 09:59:42
1822
7
原创 Flutter中Get.snackbar和Get.dialog关闭冲突问题记录
之所以会产生冲突,是因为Get.snackbar在关闭时会会有一个动画,这个动画的默认持续时间为1s,这个动画的持续时间内,Get.snackbar并没有真正意义上的关闭,这时候我们调用Get.back()是无法关闭Get.dialog。在使用GetX框架时,同时使用了Get.snackbar提示框和Get.dialog加载框,当这两个widget同时存在时,Get.dialog加载框调用Get.back()无法正常关闭。2. 创建一个LoadingDialog去实现加载框。
2025-01-11 14:16:43
545
原创 Bito登录卡死问题
感觉像是这个插件的一个bug,没有任何办法,只能重启编译器,再次登录即可,在输入账号的过程中,可以提前在其他文本中编辑好复制过来,以免遇到卡死的问题。在Bito登录过程中,可能遇到输入邮箱输到一半,就突然卡死了,无论是怎么操作编辑框都没有响应。
2024-12-26 15:52:22
286
原创 开发过程中的AI插件推荐
这两款AI插件在使用过程中都为我提供了不少的便利,也大大提高了我的工作效率,弥补了许多开发过程中的知识盲区,但相对而言,相对来说,个人感觉CodeGeex还是不太够智能。4. Bito的回答在我意料之中,而CodeGeex的回答却让我略感失望和诧异,作为一款AI工具,既然已经更正错误的回答,在下一次问答中,还是回答错误,这是我不能理解和接受的,我一开始认为是不是我提问的方式有问题,于是我换了个方式进行提问,得到的结果还是一样的,如下。3. 至此,我对两款插件都是满意的,在我更正后,能正确回答。
2024-12-26 15:43:48
2288
原创 Java中String类型长度限制
Java中String类型在编译时的长度限制是65535。例如我们通过new String创建一个长度为3的字符串,这是正常的;如果我们创建一个长度超过65535的字符串,编译器也不会提示有问题,但是一旦编译就会发生报错。Java中String类型在运行时的长度限制是2^31 - 1。如果我们需要使用到一个长度超过65535的字符串,可以将字符串拆分成数个长度不足65535的字符串,让代码能正常编译,之后再进行字符串拼接即可。
2024-12-24 09:28:16
470
原创 解决Git拉取项目过大的问题
在使用Git拉取代码时,报错fatal: fetch-pack: invalid index-pack output。4.直至出现remote: Total 0 (delta 0), reused 0 (delta 0)则可进行下一步。2.进入所拉取项目的根目录分片段进行拉取,如可以先拉取100,如果还是不行,减小数值。1.选择一个目录,在该目录下先拉取项目最后一次提交项目地址。这是由于拉取的项目过大,一次无法将项目拉取下来导致的。3.拉取成功后,依次增加。6.执行命令拉取全部分支。
2024-12-24 09:27:49
987
1
原创 RecyclerView滑至底部,最后一个item显示不全的问题
这是由于RecyclerView的高度使用了wrap_content,而外部包裹的约束布局ConstraintLayout固定写死了300dp,当RecyclerView中所有的item高度低于RecyclerView的高度时,这时,显示是没有问题的,但是没有滑动效果;直接将RecyclerView的高度设置为固定值,如200dp,将其包裹的ConstraintLayout设置为wrap_content,此时运行就没有显示不全的问题了。
2024-12-14 15:55:24
698
原创 MagicIndicator自定义指示器标题样式的实现
此处传入的一个自定义的xml文件simple_pager_title_layout,此xml为一个简单的图片展示,在onSelected指示器选中时,加载了选中类型的图片,在onDeselected指示器未选中时加载了未选中类型 的图片,图片资源可自行去用List存储。除此之外,getIndicator返回bull,表示此处隐藏了指示器下标的实现,如果想实现一个自定义的指示器下标,可按实现指示器标题的实现,去自定义一个指示器下标。LinePagerIndicator就是一个简单的指示器下标,本期不做讲解。
2024-12-14 15:54:40
637
原创 Flutter中GetBuilder 和 GetX 的区别
这和原生android中LiveData使用有很大的相似性,其中update方法的作用仅仅只是通页面进行更新,并不是只更新increment方法中提到的count,若MyController 存在其他已变更的值,也会一同在页面上更新,如下例所示。当我们先点击一次Test按键时,time的值已经变更为1,但由于页面未更新,页面上time显示的值仍为0,此时我们点击Increment按钮,会发现页面上time和count同时变更为1了。当响应式变量(使用 .obs 标记)发生变化时,会自动触发 UI 的重建。
2024-12-09 16:04:13
598
原创 高德地图3D地图SDK造成ANR问题记录
2.在特定的AMAP_KEY下,在onDestroy中调用mapView.onDestroy()时,造成ANR。重新运行项目,发现图层可以正常显示了,在调用mapView.onDestroy()也不会造成ANR了。在新接手的项目中使用到了高德地图的3D的SDK,其依赖导入如下。此时,我们改变依赖导入方式,重新同步一下即可。1.在特定的AMAP_KEY下图层无法显示。
2024-12-09 16:03:08
321
原创 javafx中root的invoke方法报错Method too large问题记录
简而言之,就是无论我们使用到的类型为什么类型,该方法都会使表格该列可进行编辑,并适配对应类型,这在平时使用是没有问题的。但是如果是在view的root初始化时,tableview中创建的列数太多,且每一列都是调用的.makeEditable()方法,该view的root在调用invoke方法时就会报错Method too large。在使用javafx绘制PC桌面程序页面时,使用到了tableview,tableview可以很方便的维护一个可编辑的表,简易代码如下。
2024-10-11 16:34:09
224
原创 PriorityQueue的使用
PriorityQueue 是 Java 中基于优先级堆实现的一个队列,可以用来存储一组元素,并按照一定的优先级顺序访问这些元素,优先级高的元素会被先访问。输入: heightMap = [[3,3,3,3,3],[3,2,2,2,3],[3,2,1,2,3],[3,2,2,2,3],[3,3,3,3,3]]输入: heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]]总的接雨水量为1+2+1=4。如果队列未满,则将指定的元素插入到队列的尾部。
2024-10-11 16:31:25
609
原创 安卓沉浸式状态栏遇到的问题
在Activuty的onCreate方法中设置如下代码。在Activuty的onCreate方法中设置如下代码。在主题属性中加入如下属性。在主题属性中加入如下属性。
2024-09-19 14:52:37
717
原创 安卓LiveData与MutableLiveData的使用
LiveData还能知晓它绑定的Activity或者Fragment的生命周期,它只会给前台活动的activity回调,这样你可以放心的在它的回调方法里直接将数据添加到View,而不用担心会不会报错。LiveData与MutableLiveData的其实在概念上是一模一样的,MutableLiveData是LiveData的子类,MutableLiveData是是整个实体类或者数据类型变化后才通知,而LiveData可以具体到某一个字段,而且可以选择哪些变更需要通知变更,哪些不需要。
2024-09-19 14:52:17
920
原创 安卓在子线程中使用Toast
在安卓中,ui更新必须在主线执行,Toast是一种用于在屏幕上短暂显示消息的机制,它依赖主线程来进行创建和显示消息。当我们在子线程中直接调用Toast时,就会触发Can‘t create handler inside thread that has not called Looper报错。这个错误时由于Toast内部使用了Handler来处理消息队列,并在主线程中显示Toast,而在子线程中没有默认的Looper对象可供Handler使用。新建一个Handler,用于子线程中使用Toast。
2024-09-12 17:27:12
898
1
原创 安卓BLE蓝牙通讯
正常情况下,当触发触发onConnectSuccess回调时,设备已经连上的蓝牙的GATT,此时可认为蓝牙已连接,此时中心设备是无法和外围设备通讯的,还需根据蓝牙协议绑定指定的特征UUID,一般中心设备接收数据的为NOTIFY_CHARACTERISTIC_UUID,向外围设备发送消息的为WRITE_CHARACTERISTIC_UUID,大部分外设备还有描述符,例如接收数据需要的描述符NOTIFY_DESCRIPTOR_UUID等。断开设备后,进行重新扫描,再次连接时,可接收到Notify的消息。
2024-09-12 17:23:17
2351
2
原创 安卓BLE蓝牙断开连接的两种方式
其中newState为BluetoothProfile.STATE_CONNECTED时,表示有连接蓝牙GATT成功,BluetoothProfile.STATE_DISCONNECTED表示蓝牙断开连接,也就是当调用disconnect()方法方法时,会触发BluetoothProfile.STATE_DISCONNECTED,我们可以在触发BluetoothProfile.STATE_DISCONNECTED时,选择去释放资源,如bluetoothGatt.close()。
2024-08-30 17:40:12
1325
原创 安卓BLE蓝牙连接返回状态133问题
在调用bluetoothDevice.connectGatt连接BLE蓝牙设备后,触发蓝牙回调,如下。根据sdk,对蓝牙连接进行区分,如下。返回的status为133。
2024-08-30 17:39:36
952
1
原创 安卓自定义长按事件
上面我是实现的一个继承自FrameLayout的长按事件,因为我的点击事件即是一个FrameLayout,如果有需要,亦可改为其它view。之后在xml文件中引用该view,并在需要的地方直接调用即可。安卓系统有自带的setOnLongClickListener长按事件,但是系统自带的长按往往时间太短,不符合我们的需求,我们可以自定义一个view,来实现特定时间的长按时间。
2024-07-26 15:10:43
335
原创 安卓新建项目buildscript和allprojects问题
这时如果尝试在project下和moudle下的build.gradle文件中添加buildscript和allprojects,均会发现报错或不生效的现象。这都是2022年1月的Gradle7.1.0版本做的更新导致的,将原有的buildscript和allprojects放在了setting.gradle文件中,如下。是不是感觉很熟悉,其实就是换个名而已,需要的配置,直接在这配置就行。很容易发现buildscript和allprojects都没有了,原来的老项目build.gradle如下。
2024-07-26 15:09:45
864
原创 安卓自动打开热点的实现
其中Utils.getApp()为全局的ApplicationContext。需要注意的是,该方法仅支持在应用持有系统权限的情况下使用。
2024-07-17 17:29:59
428
原创 安卓热点通讯的实现(Socket通讯)
两个设备,其中一个设备开启热点,另外一个手设备接热点,两个设备间进行数据通信(不需要流量)。原理:开热点的设备相当于路由器,作为服务端,连接的设备作为客户端,获取路由器的IP建立Socket 连接,开始双方通信。2.ConnectThread线程和上面一致,客户端无需使用ListenerThread线程。3.确保已连接指定热点的情况下,在MainActivity中直接调用连接线程即可。5.在确保热点打开的情况下,只需在MainActivity中开启监听线程即可。4.在MainActivity中发送数据。
2024-07-17 17:29:22
884
原创 安卓避免点击事件重复触发
在安卓开发过程中,点击事件的处理是无可避免的,我们希望的是,用户点击一次,我们实现对应的一次点击事件,但是用户的操作是不可预估的,有时候往往会出现连点的情况,而我们又不希望同一事件短时间内重复触发。,接下来只需直接使用即可。
2024-07-16 14:14:16
390
原创 安卓Toast避免重复显示
在开发过程中会经常使用到Toast,对用户进行一定程度的提醒和引导,但由于一些原因导致Toast重复触发,会造成相同的提示一直重复显示的情况,为此,我们可以自己些一个Toast,避免重复显示的尴尬。其中Utils.getApp()为全局的ApplicationContext,之后只需在用到的地方调用即可。
2024-07-16 13:48:12
398
原创 安卓自动打开热点的实现
需要注意的是,无论setWifiApEnabled方法还是startTethering方法,都是需要在获得系统级的权限下方法使用,需在AndroidManifest.xml中添加android:sharedUserId=“android.uid.system”。在低版本的安卓设备中,使用此方法去打开热点是可以的,但在高版本安卓设备中,就会发现method1.invoke(mWifiManager, netConfig, onoff)返回值始终为false,热点也无法正常打开。1.传统打开热点的实现。
2024-06-27 14:47:36
878
原创 安卓获取已连接wifi ssid为<unknown ssid>解决方案
对于低版本安卓设备,这是可行的,但是对于高版本设备就会出现获取到的wifi名称为的现象,这是因为安卓10获取WiFi名称需要定位权限。需要注意的是,即便请求权限成功,设备的GPS位置也需要打开,否则也获取不到wifi的ssid。ACCESS_FINE_LOCATION权限也是必要的,这是安卓10新加的权限。① 在AndroidManifest.xml中加入wifi权限和位置权限。1.正常下获取当前已连接wifil的ssid方法如下。③ 动态请求权限成功后,再执行获取WiFi信息即可。
2024-06-27 13:59:14
2372
原创 安卓Fragment使用注意事项
如果此时新建一个FragmetOne,该FragmetOne中有一个TextView,我们在TextView中输入"test"文本,之后我们使用replace+addToBackStack的方法启动一个新的FragmentTwo,此时我们点击返回,会返回FragmetOne界面,但是此时会发现,我们之前输入的文本没了,这是因为FragmetOne的视图被销毁了,在返回后,FragmetOne视图进行重新创建,重新 创建的视图自然没有之前输入过的文本。其中hidden为true时,表示调用的hide方法;
2024-06-26 13:26:44
1074
原创 安卓屏幕适配方案(修改像素密度)
px值 = dp值 * metrics.density,这里的density是指的手机的屏幕密度,由系统提供,不同的手机的density可能不同,所以我们不能直接使用系统的density,通过修改density值,强行把所有不同尺寸分辨率的手机的宽度dp值改成一个统一的值,这样就解决了所有的适配问题。该实现是基于设计图宽度为640dp进行适配的,假如UI设计图不一致,只需更改对应的值即可。除此之外,我们也可以高度进行适配,只需替换一行代码即可,例如以高度400dpj进行适配,如下。
2024-05-15 16:14:31
1206
1
原创 安卓Service中bindService和IBinder实现通信
2.新建一个继承自Service的类MyService,然后在AndroidManifest.xml里注册这个Service,在MyService里实例化一个MyBinder对象mBinder,并在onBind回调方法里面返回这个mBinder对象。5.当在点击事件发送一条消息后,mBinder会获取这条消息,并发送给MyService,在MyService 执行完成后,又会反馈给mBinder,并通过接口回调的方法,将成功信息反馈给Activity,打印日志如下。
2024-05-15 11:21:58
361
原创 安卓前台服务的使用
在onCreate中创建通知的优势是无论该服务是通过startService还是bindService启动的该服务,都会调用onCreate方法,所以通知都可以正常创建,除此之外,onCreate方法仅会调用一次,可以有效避免重复创建。当然,针对定制化的通知,也可根据需求在onStartCommand和onBind中进行创建。值得注意的是,如果采用的是bindService的方法,一定记得onDestroy中及时解绑,避免内存泄漏。2.在MyService的onCreate方法中创建通知。
2024-05-06 16:00:36
263
原创 Android学习记录
默认情况下,Android主线程(UI线程)已经有了一个Looper,但对于子线程,你需要手动调用Looper.prepare()来准备Looper环境,并在完成操作后调用Looper.loop()开始循环,在子线程执行这些操作之前,是不能创建Handler的。HandlerThread是Google封装好的一个类,它的内部有自己的Looper对象,可以进行Loop轮询,用于执行多个耗时操作,而不需要多次开启线程,本质是使用Handler和Looper实现的。但是有点需要注意的是,
2024-03-28 17:37:52
1070
原创 安卓SurfaceView+HandlerThread的使用
在SurfaceTestView 初次加载的时候,先创建 HandlerThread 对象,调用 HandlerThread 的 start() 方法启动线程,再创建一个 Handler 与 HandlerThread 的 Looper 绑定,这样mHandler 发送的所有消息都会交给mHandlerThread 的Looper进行处理,在绑定完成后调用update()方法对ui进行初次绘制,这样就的到的一个“当前:0”的简单文本。① 可以在独立的线程中进行绘制操作,避免主线程的阻塞;
2024-03-28 16:48:27
620
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人