- 博客(79)
- 资源 (2)
- 收藏
- 关注
原创 协程启动 GlobalScope.launch和runBlocking的区别
其中runBlocking会阻塞主线程,直到回调代码执行完毕,该方法不能用来异步启动,只能用来从非协程作用域切换到协程作用域(比如执行suspend块代码)使用GlobalScope.launch{}.start(),表示在非协程作用域中启动协程,该方法不会阻塞主线程。可以看出,runBlocking在执行时会阻塞主线程,而GlobalScope不会。runBlocking和GlobalScope.launch{}.start()如果想在协程非作用域中启动协程,有两种方法。执行下操作就能看出区别。
2023-04-06 11:17:58
1010
原创 viewbinding快速填充数据
viewbinding控件id和any属性名称一致,然后使用反射填充数据fun ViewBinding.invoke(any: Any){ any.javaClass.apply { declaredFields.forEach { kotlin.runCatching { it.isAccessible = true val value = it[any].toString()
2022-02-25 11:06:22
2204
原创 android11以上 uri转file uri转真实路径
很久以前,曾经写过针对anddroid10 uri转file的方法:android10以上 uri转file uri转真实路径_jingzz1的博客-优快云博客_android uri转filefun uriToFile(context: Context, uri: Uri): File? = when(uri.scheme){ ContentResolver.SCHEME_FILE -> uri.toFile() ContentResolver.SCHEME_CONTENT ->{ val
2021-10-31 12:29:18
5223
5
原创 kotlin 判断文件编码
fun code(ins: InputStream): String { val head = ByteArray(3) ins.read(head) return when { (head[0].toInt() == -1 && head[1].toInt() == -2) -> "UTF-16" (head[0].toInt() == -2 && head[1...
2021-10-27 14:21:36
517
原创 kotlin serialization 使用指南(一)
Kotlin serialization是由kotlin官方提供,可将kotlin对象序列化和反序列化的插件,支持序列化格式包括:JSON, Protobuf, CBOR, Hocon 和Propertiesserialization使用非常简单: //序列化 val data = Project("kotlinx.serialization", "Kotlin") val json = Json.encodeToString(data) //反序列化 .
2021-10-08 12:24:56
11420
2
原创 android10以上,访问Android/data文件
自从android10使用分区存储后,文件的操作显得更为复杂,幸运的是,谷歌为我们提供许多操作简单的api,这篇文章主要讲的是android除沙盒目录和共享目录外其他目录的操作android10以上,如果想要获取其他文件,最简单的方法是申请MANAGE_EXTERNAL_STORAGE权限,获取该权限之后,任何文件都可以正常操作,然后你就不用往下看了……虽然不可避免地,MANAGE_EXTERNAL_STORAGE注定会被滥用,我个人并不推荐使用MANAGE_EXTERNAL_STORAGE权限,因
2021-09-25 20:48:21
5033
原创 kotlin list转map
kotlin list转map需要分成两步,首先转成List<Pair> ,List<Pair>再转成mapclass Person(val name:String,val age:Int)val list = mutableListOf(Person("1",0),Person("2",0))val map<String,Person> = list.map { it.name to it }.toMap()...
2021-09-16 09:35:31
3309
原创 android CheckBox修改颜色
如果只想修改颜色,不需要修改图像的话,使用buttonTint属性足够 <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:buttonTint="#990000" android:checked="true"/>
2021-08-09 11:34:34
4484
原创 DataBinding自定义双向绑定
这里以CompoundButton系列控件(CheckBox、Switch、ToggleButton等CompoundButton)为例双向绑定Checked首先是写入Checked的方法@BindingAdapter("isCheck")fun setCheck(view: CompoundButton, isCheck:Boolean?){ if(isCheck != null && view.isChecked != isCheck) view.is
2021-08-04 08:57:08
799
原创 kotlin 集合去重
val array = listOf(1,2,3,1,2,2,3,1) println(array) //去重 println(array.toSortedSet().toList()) print: [1, 2, 3, 1, 2, 2, 3, 1] [1, 2, 3]
2021-04-04 12:45:02
5891
原创 andorid10 调用震动
获取震动器val vibrator = (getSystemService(Context.VIBRATOR_SERVICE) as Vibrator)调用震动vibrator.vibrate(VibrationEffect.createOneShot(200, VibrationEffect.DEFAULT_AMPLITUDE))其中参数 200表示震动200毫秒,DEFAULT_AMPLITUDE表示震动效果为默认从方法可以看出,震动效果主要用VibrationEffect操作.
2021-04-01 16:18:10
2114
原创 edittext 正则限制
//edittext 正则限制fun EditText.regex(regex:String){ addTextChangedListener(object : TextWatcher { var last:String = "" override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } override fun.
2021-03-29 10:45:50
291
原创 kotlin Unicode、String互转
//char ->Stringfun encode(char: Char) = "\\u${char.toInt().toHexString()}"//unicode ->Stringfun encode(text: String) = text .toCharArray() .map { encode(it) } .toList() .joinToString(separator = "", truncated = "")//String -&g..
2021-02-28 20:34:01
3251
原创 Retrofit2 json请求
使用Retrofit2进行json请求是个老生常谈的问题,值得单独水一期总体来说,Retrofit2传递json有三种方法首先初始化一下,这里使用官方提供的GsonConverterimplementation 'com.squareup.retrofit2:converter-gson:2.6.2'val retrofit = Retrofit.Builder().client(OkHttpClient.Builder().build()) .baseUrl(b
2021-01-29 09:46:29
1556
原创 MutableLivedata和LiveData的区别
两者的区别看源码就知道,LiveData的postValue和setValue方法是protected,而MutableLiveData这两个方法则是public,也就是说Livedata只允许调用observe方法被动监听数据变化,而MutableLiveData除了监听变化外,还可以用postValue和setValue方法发射数据...
2021-01-19 13:29:29
2380
1
原创 WindowInsetsController简单使用
WindowInsetsController是android官方在api30之后提供,用于控制window的控制类,实现window控件的简单化要使用WindowInsetsController,需要先将core版本提高到1.5.0以上:implementation 'androidx.core:core:1.5.0-alpha05'实例化WindowInsetsController:val controller = ViewCompat.getWindowInsetsControlle
2020-12-21 10:59:04
22006
7
原创 android 通过uri获取文件大小,uri获取文件长度
通过uri获取文件大小有两种方法,一种是通过FileDescriptor获取 fun length(context: Context, uri: Uri): Long = when (uri.scheme) { ContentResolver.SCHEME_FILE -> File(uri.path).length() ContentResolver.SCHEME_CONTENT -> try {
2020-12-13 12:02:46
4711
3
原创 android Switch 修改颜色 修改样式 滑块颜色
设置switch颜色的四个属性: <androidx.appcompat.widget.SwitchCompat android:layout_width="wrap_content" android:layout_height="wrap_content" app:trackTint="#aaaaaa" app:trackTintMode="multiply" app:thumbTint="@color/c.
2020-11-27 14:00:38
4994
原创 intellij idea , android studio,kotlin类型展示
新版和旧版设置方法不同旧版 :Settings -> Editor -> General -> Appearance -> "Show parameter name hints" -> Configure... -> Language: Kotlin -> Options -> "Show local variable type hints"新版:Settings->Editor -> Inlay Hints -> kot..
2020-11-26 17:54:13
1265
1
原创 android studio 4.1 使用Parcelable插件
as4.1不需要什么Parcelable插件了,开发工具自带转Parcelable转能只需要让类实现Parcelable (implements Parcelable),然后鼠标移动到类名上,快捷键alt+enter,选择Add Parcelable Implementation,就能自动生成Parcelable代码...
2020-11-20 10:52:20
2622
1
原创 Fragment 监听返回键操作
androidX之后,添加了新的返回事件api requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { //该事件是否自行处理 true:该事件不向上传递
2020-10-29 14:17:10
2111
原创 Retrofit 协程 下载
下载//Service的写法interface UrlService { @Streaming @GET suspend fun downloadFile(@Url url:String): Response<ResponseBody>}调用下载方法下载状态是以流的形式打开,获取到流后转成LiveData,这样就可以绑定生命周期了就是这么简单!! val dowloadUrl = "下载地址" download(.
2020-08-31 17:02:53
3057
6
原创 is attempting to registerForActivityResult after being created. Fragments must call registerForActiv
is attempting to registerForActivityResult after being created. Fragments must call registerForActivityResult() before they are created (i.e. initialization, onAttach(), or onCreate())fragment:1.3.0-alpha08 之后,需要在Fragment注册registerForActivityResult,注册体需
2020-08-21 11:20:14
7912
原创 Only classes are allowed on the left hand side of a class literal
kotlin中,如果我们希望获取到某个类或属性的类型,一般会用::class.java 或者.javaClass,比如我们希望获取String的type,可以直接这样写:String::class.java 这样写的合法的,因为编译器知道String的类型但当一个对象有多个泛型嵌套时,比如:List<String>::class.java ,这时编译器就会提示:Only classes are allowed on the left hand side of a class litera..
2020-08-07 15:06:51
6165
1
原创 android 高德地图 定位蓝点不显示
照官方文档的写法: MyLocationStyle().apply { interval(2000) showMyLocation(true) aMap.myLocationStyle = this aMap.isMyLocationEnabled = true }写完后发现蓝点没出来,看遍文档也没发现原因,最后回去查看去年写的代码,发现要显示定位蓝点,需要 ACC.
2020-07-18 20:07:38
2673
原创 registerForActivityResult()
registerForActivityResult()是startActivityForResult()的替代,简化了数据回调的写法最简单最常用的写法: //java写法 registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Ove.
2020-07-14 15:27:42
50223
11
原创 MoshiUtils Moshi解析json Moshi解析工具类
添加依赖: kapt 'com.squareup.moshi:moshi-kotlin-codegen:1.9.3' implementation 'com.squareup.moshi:moshi:1.9.3'使用kotlin的内联函数,很大程度上可以缩减代码,减少一些不必要的传参,比如可以不用传class,type等import com.squareup.moshi.Moshiimport com.squareup.moshi.Typesimport jav...
2020-07-13 15:05:39
2623
原创 Retrofit+协程 文件下载
//Service的写法interface UrlService { @Streaming @GET suspend fun downloadFile(@Url url:String): Response<ResponseBody>}//开启协程并下载,为了方便调用,下载方法我封装成DSL,参考DowloadBuild lifecycleScope.launch() { val response = RetrofitUtils.create() .
2020-07-09 18:12:04
2891
8
原创 Retrofit json上传,文本上传,文件上传,多文件上传,文本+文件上传,多文件+多文件上传
首先有个坑,Retrofit不会识别Any类型,如果直接使用Any类型传递参数,会报Parameter type must not include a type variable or wildcard的错误,这种时候需要添加注解:@JvmSuppressWildcards//一般我们直接添加到类名上面,如:@JvmSuppressWildcardsinterface UrlService {}也可以添加到请求方法体上,如: @JvmSuppressWildcards @
2020-07-06 12:22:35
1805
原创 android studio4.0 无法自动创建activity,fragment等问题
module下的 build.gradle文件,如果你需要配置signingConfigs模块,那么有两个规则需要遵守1,signingConfigs模块的配置需要写在buildTypes模块之前,如下:android { …… signingConfigs { …… } buildTypes { release { minifyEnabled false proguardFi
2020-06-08 12:59:48
5878
16
原创 android 根据MimeType获取文件扩展名(后缀名)
String extensionName = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType)
2020-05-27 11:18:15
2195
原创 android10 获取文件夹,遍例文件夹下所有文件
//首先,调用选择器获取文件夹uri val PICK_FILE = 10 private fun pickFile() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) startActivityForResult(intent, PICK_FILE) } override fun onActivityResult(requestCode: Int, resultCode:
2020-05-25 17:33:38
6094
原创 android10 保存图片到系统相册,刷新媒体库
android9之前,保存图片使用MediaScannerConnection,android10之后,则需要把文件复制到DCIM目录下,虽然android10的方法可以向下兼容,但复制文件效率始终不如刷新媒体库,所以最好是根据SDK_INT选择方法 //保存图片 public static void scanFile(File file){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
2020-05-22 08:46:44
9325
2
原创 android10以上 uri转file uri转真实路径
fun uriToFile(context: Context, uri: Uri): File? = when(uri.scheme){ ContentResolver.SCHEME_FILE -> uri.toFile() ContentResolver.SCHEME_CONTENT ->{ val cursor = context.contentResolver.query(uri, null, null, null, null) curso.
2020-05-18 10:50:06
22990
10
原创 java调用kotlin的扩展方法、扩展属性、扩展函数
kotlin的扩展方法,其实是以java的静态方法形式存在的,也就是说如果要用java调用kotlin的扩展方法,和调用静态函数一样调用扩展属性也是相同的道理举个例子,我们在某个kotlin文件(文件名为Utils.kt)里为Throwable写一个根据错误类型返回错误消息的扩展方法:fun Throwable.getShowMsg1():String{ return when(this){ is HttpException ->"${ when(
2020-05-13 11:36:22
9885
3
原创 android10调用相机和相册,裁剪图片,anroid11 图片操作工具类
由于是调用系统功能,因此不需权限 //调用相机 PhotoUtils.camera(supportFragmentManager,"你的authority"){ uri, success, msg -> if(success) Glide.with(this).load(uri).into(binding.ivImage) } //调用相册 .
2020-05-11 13:48:27
8904
26
原创 android uri获取文件名
从android11开始,文件只能通过uri操作,包括获取文件名var displayName = "" val query = context.contentResolver.query(uri, null, null, null, null, null) query?.use { it.moveToFirst() displayName = it.getString(it.getColumnIndex(Openabl
2020-05-08 17:32:14
3606
原创 ViewBinding封装基类(BaseActivity,BaseFragment)
BaseActivity:public class BaseActivity<T extends ViewBinding> extends AppCompatActivity { protected T binding; @Override protected void onCreate(@Nullable Bundle savedInstanceStat...
2020-05-03 21:32:15
12935
4
原创 android 闪光灯(手电筒)工具类
需要闪光灯权限:<uses-permission android:name="android.permission.FLASHLIGHT"/>部分手机需要摄像头权限:(敏感权限)<uses-permission android:name="android.permission.CAMERA"/>调用前,至少需要初始化一次,可以考虑在Application里调用...
2020-04-27 11:52:46
2316
2
emojis表情包 json文档
2020-09-28
中国省市区json.docx
2020-01-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人