自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 生产者和消费者的实现

生产者和消费者模型

2023-05-06 10:11:30 144 1

原创 小程序关闭Log

小程序关闭Log

2023-02-08 14:50:06 230

原创 AIDL简单示例

为了实现不同间进程通信,我们会使用到AIDL。由服务端提供服务,客户端通过AIDL链接服务端,以调用服务端对应的功能。

2022-10-18 10:09:03 1209

原创 判断手势操作是否画了一个圆形

通过手势画一个“符”,判断这个“符”是不是圆形。

2022-09-30 16:45:54 339 2

原创 Android Button长按执行周期事件

长按按钮时,周期执行对应事件。

2022-09-21 10:22:59 815

原创 ViewPager2使用记录

ViewPager2使用中遇到的小问题

2022-06-27 10:29:58 619

原创 Button长按连续执行命令

需求:按住按钮,每100ms执行一次命令。

2022-06-04 20:04:49 372

原创 使用ListAdapter时Submit无效

问题在RecyclerView中使用ListAdapter可以更高效的对数据进行更新,不再无脑的使用adapter.notifyDataSetChanged()。但在使用过程中,有一个很容易掉坑的地方,就是在使用ListAdapter.submitList(list:List)方法时,每次需要传入一个新的List,否则更新无效。解决办法办法一:重写ListAdapter的submitList方法,如果传入的list不为空,则重新创建一个list,并添加传入的数据。 override fun su

2022-04-10 23:54:20 1787 3

原创 ViewModelScope 协程取消

背景:在ViewModel中有个协程方法(viewModelScope),里面是whlie(true),始终进行网络查询。该方法由fragment中的onResume调用现象:发现在viewmodel结束后,该协程依旧不停止。(原因有待确认)过程:改进为while(flag),在viewmodel中,重写onCleared()方法,将flag置为false。此方法仅在viewmodel生命周期结束后才有效。即对应的 fragment / activity onDestroy 之后才有效。如果

2022-03-12 00:05:55 1019

原创 LifeCycle 极简示例

TestLifeCycle.kt实现LifecycleObserver 接口,需要根据生命周期执行的方法加上对应的注解即可。class TestLifeCycler : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { Log.d(TAG, "onResume: test") } @OnLifecycleEvent(Lifecycle.

2022-03-07 14:27:15 172

原创 Android 应用全屏

每次搞沉浸式全屏的时候,都是查来查去的。这里面代码虽然简单,但内容不少。今天在此记录一下。style/themes.xml<resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> //主题切换成NoActionBar,隐藏标题栏 <style name="Theme.InstallTool" parent="Theme.AppCom

2022-02-09 10:06:15 1351

原创 Android Log记录

将打印的Log保存成txt。public class LogcatHelper { private static final String TAG = LogcatHelper.class.getSimpleName(); private static LogcatHelper INSTANCE = null; private static String PATH_LOGCAT; private LogDumper mLogDumper = null; priva

2022-01-26 14:14:24 175

原创 Activity管理工具

ActivityUtil.javapublic class ActivityUtil { private static Stack<Activity> activityStack = new Stack<>(); private static final MyActivityLifecycleCallbacks INSTANCE = new MyActivityLifecycleCallbacks(); public ActivityUtil() {

2022-01-13 13:56:34 1465

原创 Android 回调队列

平时如果我们正常写一个回调,那只有最后注册这个回调的实例才可以接收到该回调。但有时需要多个实例同时注册回调,当发生回调事件时,通知全部注册了回调的实例。此时我们只要将回调加入到一个列表中即可。class ListenerTest { //注册回调的列表 private var listenerList: MutableList<ITestListener> = mutableListOf() /** * 执行模拟任务 */ init

2022-01-04 11:17:57 997

原创 Kotlin<协程>异步回调封装

文章目录目的例子原始形式改造回调优化:并行处理事件流目的协程用起来很方便,可以将异步的代码完全平铺开,写成和同步一样的代码形式。但很多时候,很多方法是以回调的形式给出的,所以处理起来依旧不够优雅。本篇文章的目的就是解决这个问题。例子原始形式以OkHttp为例,OkHttp就是以回调的形式给出网络请求结果。通常我们的写法如下: /** * 原始写法 */ private fun okHttpTest() { client.newCall(request

2021-12-30 10:58:33 1123

原创 Fragment返回键监听处理

在Fragment中,没有onBackPressed方法。参考下面的方法,可以监听到返回键。@Overridepublic void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override

2021-12-09 11:06:54 1149

原创 adb connect 失败

一直使用 adb connect 远程链接手机进行调试。今天在链接的情况下,手机被我重启了,再次连接就提示 unable to connect to <ip> :5555解决办法如下:输入 adb tcpip 5555,再进行链接就可以了。

2021-12-08 11:23:27 437

原创 给模拟器发短信/打电话

想做一个自动提取短信的功能,所以需要频繁的使用到收到短信的功能。1. 通过 telnet 与模拟器通信打开终端,输入: telnet localhost 5554localhost : 本机地址5554: 模拟器端口号成功后提示:Android Console: Authentication requiredAndroid Console: type ‘auth <auth_token>’ to authenticateAndroid Console: you can f

2021-11-29 17:13:42 4064 1

原创 Android Studio上运行main()方法报错

在Android Studio上直接运行main()方法,提示SourceSet with name ‘main’ not found解决办法:在.idea文件夹下的gradle.xml文件中添加<option name="delegatedBuild" value="false" />,然后重新运行就可以了参考:AS运行main()方法报错...

2021-11-11 09:26:06 1435 1

原创 用Dialog实现自定义音量条

项目上之前用的是自定义View去实现的音量条,但因为某些问题,要换成使用Dialog方式去实现。Dialog.java:public class NewDialog extends Dialog { private static final String TAG = NewDialog.class.getSimpleName(); private static final int DURATION = 2 * 1000; private Context context;

2021-11-04 09:10:20 264

原创 自定义Dialog

MyDialogpackage com.suhang.testdemo;import android.app.Dialog;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.view.Gravity;import android.view.WindowManager;public class MyDialog extends Dialog {

2021-10-29 16:39:42 57

原创 Framework开发记录 -- 编译

文章目录一、代码编译1. 整体编译2. 部分编译二、注意事项一、代码编译1. 整体编译在源码根目录,执行 source build/envsetup.sh //加载编译环境配置执行 lunch 选择要编译的平台及类型示例:aosp_arm-eng //AOSP:android open source project ; arm: 平台 ; eng: 编译类型(engineer工程版)(还有userdebug、user)执行 make -j8 // make表示整体编译,-j8表示使用8个线

2021-10-28 16:19:00 343

原创 记一次编译失败解决过程 -- 错误: 找不到符号

背景:  项目上需要修改一个实现,跑的是Git上下载下来的代码,第一次编译,报错。看了一下依赖、引用等内容,确定依赖包都存在,又进行了一次编译,再次报错。  报错内容很明确:错误: 找不到符号 ,并指出了所找不到的类和所在行。分析:  观察发现,无法找到的类、方法、变量都是和蓝牙相关的,所以第一时间反应是使用了定制的Framework。到gradle文件里看了一下配置,确实引用了。第一次调试:  于是去 .idea/moudle/*.iml 文件中调整Framework引用位置,重新编译。第一

2021-10-28 16:01:59 6888 3

原创 Android NDK 开发入门详解(三) ---- Java和C++方法相互调用

一、Java调用C++方法

2021-10-20 17:08:27 621

原创 Android NDK 开发入门详解 (二)---- C++中添加Log / 配置查看C++方法签名工具

在C++文件中,如果使用正常的Log输出方式,是无法在Android Studio的控制台中看见Log内容的,需要通过如下配置:在gradle文件中,加入如下配置:defaultConfig { applicationId "com.example.myapplication" minSdk 29 targetSdk 31 versionCode 1 versionName "1.0" testInst

2021-10-20 15:47:15 607

原创 Android NDK 开发入门详解(一) ---- 环境配置

文章目录一、 Android Studio 中下载NDK和CMake相关工具二、将Android工程变成NDK工程2.1 已有的普通Android工程,变为NDK工程:一、 Android Studio 中下载NDK和CMake相关工具二、将Android工程变成NDK工程2.1 已有的普通Android工程,变为NDK工程:创建cpp文件夹及文件在main目录下创建cpp文件夹,然后创建C/C++ source file。创建CMake构建脚本因为目前这个项目没有CMake的构建脚

2021-10-20 15:33:55 865

原创 Android Studio 日志乱码解决方案

参照 链接 方法二

2021-09-29 15:34:34 102

原创 利用Drawable绘制圆角图片和圆形图片

文章目录效果图圆角图片圆型图片使用在开发工程中,我们可能会使用到圆形图片或圆角图片,如用户头像位置。可以利用Drawable的方式,轻松制作。效果图圆角图片public class RoundDrawable extends Drawable { private Paint mPaint; //图片画笔 private RectF mRectF; //创建一个矩形,将图片绘制到该矩形上。 private Bitmap mBitmap; //需要绘制的图片

2021-09-22 10:58:18 918

原创 Android Studio更换启动页封面

在知乎上看到的内容,觉得挺有意思,就记录下来了。把AS安装目录下面这个jar打开 \Android Studio\lib\resources.jar 修改替换 artwork/studio_splash.png 和 artwork/[email protected] 别改尺寸大小重新打包成jar,替换。...

2021-09-18 10:50:09 840

原创 自定义注解

对注解一直不是很了解。最近得空,学习一下自定义注解,写了一个小Demo。编写一个替代findViewById的注解1. 先定义一个注解注解遵循: public @interface 注解名 {方法参数}@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)public @interface ViewInject { int value() default -1;}2. 编写一个类,去实现注解内容publi

2021-09-18 10:46:49 53

原创 BaseActivity

文章目录1. 替换findViewById只为积攒一点工具类,用的时候方便1. 替换findViewById //正常方法 protected <T> T $(int resId) { T t = (T) findViewById(resId); return t; } //直接带注册点击事件方法 protected <T> T $(int resId, View.OnClickListener

2021-09-18 09:50:21 50

原创 Android 反射机制简单使用及总结

文章目录关于反射实现反射的三种方式示例其他用法未完待续关于反射开发过程汇总偶尔会用到反射相关的内容。每次使用到时都是在网上找Ctrl+CV,没去梳理总结过,今天正好想起来了,就做一个简单的总结,也加深一下印象。在我的日常开发工作中,反射主要是用来调用一些被系统隐藏掉的API,以便实现某些需求。实现反射的三种方式使用Class类的静态方法forName(),用类的名字获取一个Class实例 ;利用对象调用getClass()方法获取该对象的Class实例;运用.class的方式来获取Class

2021-09-14 16:15:50 430

原创 构造器模式(Builder模式)

目的当我们想要创建一个实体的时候,如果该实体中有大量的参数可以根据需求选择是否传入。通常我们有两种方式去实现:重叠构造器重叠构造器的场景很常见,通常我们会按照需求不断重载构造方法,提供不同的参数。这样的方式当参数多起来的时候,会变得很难阅读,且十分容易发生传入错误的情况,同时还会存在同类型参数只能有一个存在的情况(如只传入作者的话,就无法重载只传入ISBN或只传入分类的情况)。Demo:public class Book { /** * 书名和价格为必需,其他内容为可选

2021-09-02 10:24:32 328

原创 if-else的优化方式(枚举/策略模式)

1 . 枚举枚举中可以定义抽象方法,从而实现根据不同的入参选择不同的执行代码。Action.javapublic enum Action { //定义枚举类型 EAT { @Override void run() { Log.d("TAG", "eat!"); } }, DRINK { @Override void run() { Log.d("TAG", "slee

2021-09-02 09:37:43 872

原创 AB猜数字游戏

文章目录猜数字游戏游戏说明项目设计代码实现这是我的第一篇博客,没什么目的,就随便写的,权当联系如何写blog了。猜数字游戏想起小时候在文曲星上玩的猜数字游戏,摸鱼的时候就自己做了一个。目前没做UI上的美化,仅实现了基础功能。游戏说明游戏规则很简单,程序随机生成一个四位数的数字(不包含重复数字),然后由玩家进行猜测。如果猜的数字对了但位置不对,记B+1;如果猜的数字对了且位置也对,记A+1。都猜对时结果即4A0B。项目设计采用了Jetpack的LiveData和ViewModel,实现数据和

2021-09-02 08:42:54 1065

空空如也

空空如也

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

TA关注的人

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