LaunchedEffect:在Jetpack Compose中使用协程
LaunchEffect允许我们在Composable中使用协程
1234@Composable fun DisposableEffect( vararg keys: Any?, effect: DisposableEffectScope.() -> DisposableEffectResult): Unit
像DisposableEffect一样,当Composable进入composition时执行block
当Composable从树上detach时,CoroutineScope执行cancel
参数keys发生变化是,会执行cancel后再次执行effect简而言之,就是支持执行Coroutine的DisposableEffect,会自动执行cancel,不需要手动onDispose
Retrofit和moshi的搭配使用模板
moshi,新一代Json解析库基本用法
12345678910111213141516fun main() = runBlocking { val moshi = Moshi.Builder() .addLast(KotlinJsonAdapterFactory()) .build() val json = """{"_name":"xxx","age":12}""" val person = moshi.adapter(Peoson::class.java).fromJson(json) println(person)}@JsonClass(generateAdapter = true)//为了贴合condegen使用,他可以提高moshi在kotlin中的运行时速率data class Peoson( @Json(name = "_name") ...
kotlin默认参数没在源代码中定义
在使用kotlin协程时,突然发现一个无法理解的语法。在下图中,是runBlocking的源代码可以发现,他需要接受两个参数,第一个是context,第二个则是我们自己的lambda函数。而实际上,我们并没用传入第一个参数进去,他却可以正常的运行而不报错。他也并没有默认的参数。
解释首先我们要理解的是kotlin是个多平台支持的语言。因此他在实现某些功能时,需要兼容win,linux,java等多平台。例如:我们正在使用的协程库,肯定是一个多平台库。
expect actualKotlin中的expect和actual是一对关键字,用于实现跨平台的编程,特别是在编写多平台库(Commons Kt)时。在这种情况下,我们需要在一个公共的Kotlin文件中定义接口和类,而实现则需要针对不同的平台进行特殊处理,因为不同平台的操作系统和硬件配置有所不同。
expect和actual关键字是为了解决这种情况而设计的。expect用于声明一个接口或类,以及其所需要的属性和方法;而actual则用于提供这个接口或类的实际实现。这种技术可以让我们以一种抽象的方式编写代码,而不用关心它在不同平台上的实现 ...
jetpack compose(入门)
为什么我们需要一个新的UI 工具?原因是 View.java 这个类实在是太大了,有太多的代码,它大到你甚至无法在Githubs上查看该文件,因为它实际上包含了 30000 行代码,这很疯狂,而我们所使用的几乎每一个Android UI 组件都需要继承于View.
Compose API 的原则
Compose是一个声明式UI系统。 他的一切都是函数
在Compose的世界中,没有类的概念,全都是函数,并且都是顶层函数,因此不会有任何继承和层次机构问题。
组合优于继承
信任单一来源
Compose运行Core
绘制(Draw) Draw 给了你访问Canvas的能力,因此你可以绘制你要的任何自定义View
布局(Layout) 通过布局,我们可以测量事物并相应地放置视图
输入(Input)开发人员可以通过输入访问事件并执行手势
语义(Semantics) 我们可以提供有关树的语义信息
FoundationFoundation的核心是收集上面提到的所有内容,并共同创建一个抽象层 ,以使开发人员更轻松调用
Material在这一层。所有的Material组件将会被提供,并且我们可以通过 ...
Android(开发开源库)
只要是编写一个库提供给其他的项目去使用,就可以统称为SDK开发。SDK开发多数情况下是以实现功能逻辑为主的,而不会有ui设计。SDK开发面向的用户群体从来都不是普通用户,而是其他开发者。
简化运行时权限APItypealias关键字可以用于给任意类型指定一个别名,如:typealias PermissionCallback = (Boolean, List<String>) -> Unit
Android开发高级技巧
全局获取context前提:或许目前你还没有为得不到Context而发愁过,因为我们很多的操作是在Activity中进行的,而Activity本身就是一个Context对象。但是,当应用程序的架构逐渐开始复杂起来的时候,很多逻辑代码将脱离Activity类,但此时你又恰恰需要使用Context,也许这个时候你就会感到有些伤脑筋了。解决:Android提供了一个Application类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的Application类,以便于管理程序内一些全局的状态信息,比如全局Context。
123456789class MyApplication : Application() { companion object { lateinit var context: Context } override fun onCreate() { super.onCreate() context = applicationContext }}
这样我们就可以以静 ...
Android(Jetpack)
JetpackJetpack是一个开发组件工具集,它的主要目的是帮助我们编写出更加简洁的代码,并简化我们的开发过程。Jetpack中的组件有一个特点,它们大部分不依赖于任何Android系统版本,这意味着这些组件通常是定义在AndroidX库当中的,并且拥有非常好的向下兼容性。
MVVM架构ViewModelViewModel是可以帮助Activity分担一部分工作,它是专门用于存放与界面相关的数据的。只要是界面上能看得到的数据,它的相关变量都应该存放在ViewModel中,而不是Activity中,这样可以在一定程度上减少Activity中的逻辑。ViewModel还有一个非常重要的特性。我们都知道,当手机发生横竖屏旋转的时候,Activity会被重新创建,同时存放在Activity中的数据也会丢失。而ViewModel的生命周期和Activity不同,它可以保证在手机屏幕发生旋转的时候不会被重新创建,只有当Activity退出的时候才会跟着Activity一起销毁。导入外部依赖:implementation "androidx.lifecycle:lifecycle-ex ...
Android入门(Material Design)
一套全新的界面设计语言——Material DesignToolbor不仅仅继承了ActionBar的所有功能,而且灵活性很高,可以配合其他控件完成一些Material Design的效果.
任何一个新建的项目都会默认支持ActionBar,他被在AndroidManifest中声明,也就是被定义在了android:theme="@style/AppTheme">主题中。他的默认配置如下:
123456789<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item n ...
Android入门(网络)
WebView可以在应用中嵌入一个浏览器,从而展示各种网页
使用HTTP请求访问网络HttpURLConnection12345678910111213141516171819202122//他的流程是://先设置一个Url地址,然后通过url打开一个连接并强转为HttpURLConnection并保存为一个connection对象//为这个对象设置请求方法,超时时间如.然后获取他的输入流,然后读取即可。thread {val string = StringBuilder()val url = URL("https://zfxt.top/sentence")val connection = url.openConnection() as HttpURLConnectionconnection.requestMethod = "GET"connection.connectTimeout=8000connection.readTimeout=8000val input = connection.inputStreamval reader = ...
Android入门(Service的使用)
Serviceservice是android实现程序后台运行的解决方案。当然它并不是独立运行,而是依赖于应用程序,应用程序停止时,他也会一起停止。Service并不会自动开启线程,所有的代码都是默认运行在主线程当中的。
Android多线程编程
在kotlin中开启线程的方式更加简单。它为你定义了顶层方法thread{//方法体}直接在其中写内容,然后他会被拉起为一个新线程。
更新UI:和许多其他的GUI库一样,Android的UI也是线程不安全的。也就是说,如果想要更新应用程序里的UI元素,必须在主线程中进行,否则就会出现异常。
所以android提供了一套异步消息处理机制:解决了在子线程进行UI操作的问题1234567891011121314151617181920212223242526class MainActivity : AppCompatActivity() { val updateText = 1 val handle = object :Handler(Looper.getMainLooper()){ //在这里 ...