全部 文章 问答 分享 共找到1304个相关内容
[文章] Kotlin进阶学习5
写在前面本文上接Kotlin进阶学习4,上次的文章学习了泛型的进阶知识,真是十分难理解的知识呢。这次(最后)来学习一下Kotlin中极具特色的协程。协程介绍什么是协程呢?
2020-08-12 17:24 · Kotlin / 进阶
[文章] Kotlin进阶学习3
写在前面本文上接:Kotlin进阶学习2,在上次的文章里,我们学习了高阶函数。这次我们就来学习如何利用高阶函数简化Android中的各种常见操作,并且学习一下泛型的内容。
2020-08-10 16:08 · Kotlin / 学习
[文章] Kotlin进阶学习4
写在前面本文接上文:Kotlin进阶学习3。上次文章主要学习了泛型的一些基本用法,这次来学习一下泛型的进阶用法。这部分还是有很大的难度的,勉强记录一下。
2020-08-11 19:34 · Kotlin / 进阶
[问答] docker怎么跑编译出来的android5.1
但是出现了几个问题

  1. 编译出来的镜像怎么刷到真机上,没搜到相关教程
  2. 如果我在docker新建一个Ubuntu镜像能不能直接跑安卓系统,我看了一个docker-android
2023-12-14 15:18 · 求助 / aosp / docker
[文章] 一些关于面试的链接 已分享
面试题集(2020)Android面试题含答案Android面试题总结(含答案),欢迎各位补充。
2023-02-16 10:24 · 面经
[文章] Kotlin项目实战——天气预报类APP
写在前面在这篇文章之前,Kotlin的基础和进阶课程都已经学习完了。
2020-08-13 14:34 · Kotlin / 实战
[文章] Kotlin进阶学习2
写在前面本文紧接上文:Kotlin进阶学习1。在之前我们学习了一些Kotlin的特性,这次接着来学习Koltin中一些有用的特性扩展函数介绍扩展函数是什么呢?
2020-08-09 15:49 · Kotlin / 进阶
[文章] Docker 进阶
2.Docker概念和相关命令的学习学会了如何安装Docker之后,我们开始学习Docker相关命令、概念等基础知识,为后面灵活使用Docker打下基础。2.0Docker仓库(Repository)Docker用于存放镜像文件的仓库dockersearch2.1镜像(Image)镜像就是构建容器的源代码,是一个只读的模板,由一层一层的文件系统组成的,类似于虚拟机的镜像查看已下载的镜像dockerimages拉取相关镜像dockerpull[镜像名称:镜像版本号]2.2容器(Container)容器就是由Docker镜像创建的运行实例查看正在运行的容器dockerps查看全部容器dockerps-a停止/运行容器dockerstop/start[容器id]或者[容器name]删除容器dockerrm[容器id]或者[容器name]进入某个容器dockerattach[容器id]退出某个容器dockerexit[容器id](退出后,容器也停止运行)启动伪终端以交互的方式进入某个容器dockerexec-it[容器id]
2020-08-11 16:29 · Docker
[文章] Kotlin进阶学习1
写在前面在学习了Kotlin基础学习1,Kotlin基础学习2,Kotlin基础学习3之后,我们对Koltin的基础有了一定的了解。但就这样还是不够的,Kotlin里还有更多的特性等着我们去学习。这阶段可能会出现很多错误,希望看出来的老哥能指点一下。这次学习Kotlin中的标准函数、静态方法、延迟初始化与密封类。Kotlin中的标准函数介绍Kotlin的标准函数指的是Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数。虽然标准函数并不多,但要一次性全部学完自然是不可能的。这里就介绍几个最常用的标准函数。之前我们在Kotlin基础学习3中学习了let函数的用法,主要用于配合?.操作符进行辅助判空,这里就不再多言了。with函数with函数接收两个参数:第一个参数可以是一个任意类型的对象,第二个参数是一个Lambda表达式。with函数会在Lambda表达式中提供第一个参数对象的上下文,并使用Lambda表达式中的最后一行代码作为返回值返回。如下:valresult=with(obj){//这里是obj的上下文"value"//with函数的返回值}那么这个函数有什么用呢?它可以让我们在连续调用同一个对象的多个方法时让代码变得精简,比如:vallist=listOf("Apple","Banana","Orange","Pear","Grape")valresult=with(StringBuilder()){append("Starteatingfruits\n")for(fruitinlist){append(fruit).append("\n")}append("ateallfruits")toString()}println(result)这段代码应该很好理解,首先我们给with函数传入了一个StringBuilder对象,之后Lambda表达式的就是这个StringBuilder对象了,那么我们调用append方法自然就不需要加上前面的实例了。最后,Lambda表达式的最后一行会作为返回值返回,然后赋值给了result,把result输出。run函数run函数的用法和使用场景与with函数也差不太多,只是在语法上有一些区别。首先run函数是不能直接调用的,一定要调用某个对象的run函数才行。其次,run函数只接收一个Lambda参数,并在Lambda表达式中提供调用对象的上下文,其他方面和with函数就没什么区别了,如下:vallist=listOf("Apple","Banana","Orange","Pear","Grape")valresult=StringBuilder().run{append("Starteatingfruits\n")for(fruitinlist){append(fruit).append("\n")}append("ateallfruits")toString()}println(result)总得来说,变化很小,只是换了一下写法而已。apply函数apply函数与上面学习的run函数也十分的类似,但差别在于apply函数无法指定返回值,只能自动返回调用对象本身,如下:vallist=listOf("Apple","Banana","Orange","Pear","Grape")valresult=StringBuilder().apply{append("Starteatingfruits\n")for(fruitinlist){append(fruit).append("\n")}append("ateallfruits")}println(result.toString())因为apply函数无法指定返回值,只能返回调用对象本身,所以这里的result就是一个StringBuilder对象,我们在最后输出的时候自然还需要调用他的toString方法才行。总结总的来说,这几个标准函数用法和使用场景都十分相似,在实际编程中我们挑选合适的使用就可以了。静态方法介绍静态方法,一直在用java的我们一定不会陌生,在方法上声明一个static关键字就可以了。但非常奇怪的是,Kotlin极度弱化了静态方法这个概念,想在Koltin中定义一个静态方法反而不是那么简单。为什么会这样呢?因为Koltin提供了比静态方法更好的语法特性——单例类。像工具类这种功能,Koltin就推荐我们使用单例类,在使用上也十分方便。但单例类中每个方法都变成类似静态方法的调用方式了,那如果我们有一些方法不想这么搞怎么办呢?我们可以先把单例类变成普通类,然后使用companionobject:classUtil{fundoAction1(){}companionobject{fundoAction2(){}}}现在,doAction1()和doAction2()方法就完全不一样了,想使用doAction1()就必须先实例化,但doAction2()就不需要。不过doAction2()仍然不是一个静态方法,companionobject这个关键字实际上会在类中创建一个伴生类,而doAction2()就是定义在伴生类中的方法,不过Kotlin会保证每一个Util类始终只会存在一个伴生类对象。总的来说,在开发里,上述的特性已经足够了。可如果我比较固执,就是想用静态方法怎么办?使用注解如果想真的定义的一个静态方法,只需要在方法上加上@JvmStatic注解就好了:classUtil{fundoAction1(){}companionobject{@JvmStaticfundoAction2(){}}}但要注意,@JvmStatic注解只能加在单例类或companionobject中的方法上。这次我们的doAction2()是一个真正的静态方法了。顶层方法顶层方法指的是那些没有定义在任何类中的方法,比如我们的main()方法。Koltin会将所有的顶层方法全部编译成静态方法,因此只要你定义一个顶层方法,那么他就一定是静态方法。比如,我们创建一个kotlin文件,起名叫Helper.kt,里面输入我们想要的方法:fundoSomething(){}那么要怎么使用这个静态方法呢?十分简单,在项目的任何地方敲就是了。但如果想在java中调用,就必须要加上类名了,比如我们刚才定义的kotlin文件叫Helper.Kt,那么就可以使用HeplerKt.doSomething()来使用。这里的HelperKt是Kotlin编译器自动生成的,基本就是文件名+Kt。变量延迟初始化引入Koltin语言的许多特性我们已经学习了,但有时候很多特性会给我们的编程造成不方便,比如,如果你的类中存在很多全局变量实例,尽管你清楚的知道他们不会为空,但为了保证他们能够满足Kotlin的空指针检查语法标准,你也不得不做许多的非空判断保护才行。这就十分的让人烦了,比如下面的例子:classMainActivity:AppCompatActivity(),View.OnClickListener{privatevaradapter:MsgAdapter?=nulloverridefunonCreate(savedInstanceState:Bundle?){...adapter=MsgAdapter(msgList)...}overridefunonClick(v:View?){...adapter?.notifyItemInserted(msgList.size-1)}}这里我们将adapter设置成了全局变量,但他的初始化工作是在onCreate()方法执行的,因此我们不得不把他设置为空,同时声明为MsgAdapter?。虽然我们会确保自己已经初始化了,且能确保onClick()必然会在onCreate之后执行,但我们必须在onClick()方法里对adapter进行判空才行。当我们代码中的全局变量实例越来越多时,就会显得越来越烦人,因为很多代码都只是为了满足编译器的要求。有没有什么办法解决呢,十分简单。使用lateinit即可。使用延迟初始化使用的是lateinit关键字,它就是在告诉Kotlin编译器,这个变量我们会在之后初始化,就不需要提前赋值为null了。那么我们上面的代码就可以改写:classMainActivity:AppCompatActivity(),View.OnClickListener{privatelateinitvaradapter:MsgAdapteroverridefunonCreate(savedInstanceState:Bundle?){...adapter=MsgAdapter(msgList)...}overridefunonClick(v:View?){...adapter.notifyItemInserted(msgList.size-1)}}当然,使用lateinit方法不是没有任何风险的,如果一个变量还没初始化的时候就使用这个变量,程序自然会崩溃,抛出异常。所以,当我们对全局变量使用lateinit关键字的时候,要先确保已经初始化了。当然,我们也可以通过代码来判断是否完成了初始化:if(!::adapter.isInitialized){adapter=MsgAdapter(msgList)}虽然语法看起来很奇怪,但这是固定写法。::adapter.isInitialized可以判断adapter变量是否已经初始化。再取反,就表示如果没有初始化时去立即初始化。密封类介绍一般来讲,密封类会结合RecyclerView里的ViewHolder一起使用。当然,它的使用场景不仅限于此。有了它,可以帮助我们写出更加规范和安全的代码。使用下面,我们先来看一个例子:interfaceResultclassSuccess(valmsg:String):ResultclassFailure(valerror:Exception):Result我们定义了一个Result接口,然后定义了两个类去实现Result接口,Success表示成功时的结果,Failure表示失败时的结果。接下来,再定义一个getResultMsg()方法,用来获取执行结果:fungetResultMsg(result:Result)=when(result){isSuccess->result.msgisFailure->result.error.messageelse->throwIllegalArgumentException()}getResultMsg方法接收一个Result参数,我们通过when语句判断是哪种类型,是成功就返回成功的消息,是错误就返回错误的消息。但这里的else条件是毫无意义的,这个else是根本不可能走到的,但为了满足编译器的需求,我们只能加上这个else分支。不过,要解决这种情况也是十分简单的,使用密封类即可:sealedclassResultclassSuccess(valmsg:String):Result()classFailure(valerror:Exception):Result()可以看到,差别不是很大,我们只是把interface关键字变成了sealedclass。此外,由于密封类是一个可以继承的类,所以要加上括号。那么刚才的when判断里的else分支就不需要了:fungetResultMsg(result:Result)=when(result){isSuccess->result.msgisFailure->result.error.message}这是为什么呢?因为当when中传入一个密封类变量作为条件时,编译器会自动检查该密封类有哪些子类,并强制要求你将每一个子类的条件都处理了。这样的话,就可以保证不写else也可以不漏掉任何分支了。总结总的来说,掌握了标准函数的用法,且对Koltin中的静态函数进行了一定程度的了解。也对一些由于编译器的要求所出现的不方便的情况有了解决的能力。收获还是蛮多的,希望能在实战中加深理解吧。
2020-08-08 17:21 · Kotlin / 进阶
[问答] 关于android的职业规划想问一下
,我不知道要不要再去深入下去(有人推荐用《Android开发艺术探索》)?
2022-08-01 13:38 · Android / 学习路线
2019-09-09 21:09 · JAVA
[文章] Android——RecyclerView使用汇总
/res/android"android:layout_width="match_parent"android:layout_height="match_parent
2020-09-13 21:01 · Android / RecyclerView / 安卓 / 基础
[文章] Android通知详解
:layout_height="match_parent"android:layout_weight="1"android:text="@string/
2022-08-10 17:36 · android / 通知
[文章] Android开发学习路线
Android开发环境搭建Android开发系列环境的搭建Android基础Android开发系列UI布局讲解Android开发系列UI布局讲解Android开发系列数据持久化存储Android开发系列数据持久化存储
[问答] android studio 闪退
;at android.view.ViewGroup.layout(ViewGroup.java:6335)

    at android.widget.FrameLayout.layoutChildren

2021-05-26 17:32 · 异常
[问答] Android内存泄漏问题
$ActivityClientRecord#nextIdle     Description: Android AOSP sometimes keeps a reference to
2021-06-27 14:11 · 内存泄漏 / Android
[文章] Android Jetpack 之 Navigation
/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@
2020-09-19 15:07 · navigation / 导航 / jetpack / 组件 / android
[问答] Android开启启动
公司要求做一个自启动app,然后一开始使用android.intent.action.LOCKED_BOOT_COMPLETED,但是恢复出厂设置去收不到广播,然后使用和 android.intent.action.BOOT_COMPLETED
2020-03-19 16:24 · android
[文章] Android如何自定义Preference呢?
Android如何自定义Preference呢?
2020-03-08 00:06 · SharePreference / 存储 / 设置 / 安卓开发 / app
[文章] Android TV开发03学习HorizontalGridView
><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width
2021-09-07 20:51 · AndroidTV / Android / HorizontalGridView
[文章] Android 智能刷新框架SmartRefreshLayout
/apk/res-auto"android:id="@+id/refreshLayout"android:layout_width="match_parent"
2020-08-03 23:25 · UI
[问答] android绑定远程服务时报错
App: com.android.vending, Service: oauth2:******************************************

  

2022-05-05 09:57 · android / service
[问答] android 问题 Error inflating class fragment
; import android.view.View; import android.view.ViewGroup; public class HomeFragment extends Fragment
2022-07-03 15:51 · Android
[文章] Android Data Binding 开发普通列表
><layoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http
2021-02-01 14:05 · Android / debug / 断点 / jetpack / mvvm
[文章] Android EditText限制输入IP地址
("255");}off+=value.length();off++;}}<EditTextandroid:id="@+id/et_ip_address"android
2020-08-14 11:50 · 控件扩展
[文章] 5、Android开发基础-其他布局
><AbsoluteLayoutxmlns:android="https://schemas.android.com/apk/res/android"android:layout_width
[问答] Android 日志

公司有个需求,客户要求关闭Android 版本的log输出,这个有办法解吗?

2022-12-05 10:47 · AndroidLog
[文章] Android逆向吾爱新年题目Android01
吾爱新年题目Android01来玩玩新年题目Android的第一题:抓小猫咪。体验打开app之后是这样的:尝试捕捉猫猫。运气真好,居然抓到了。
2024-03-01 14:17 · Android / Android逆向 / hook / 反编译
[问答] Android属性设置
你好我想问一下,我设置Androidsystemproperty,在manifest中也设置了android:sharedUserId="android.uid.system"但是通过set设置属性的时候还是
2021-03-24 11:08 · Android / 属性 / Android属性设置
[问答] Android 打开Uri图片 问题
false">public void openFile(String filePath, String filename) { // filePath = /storage/emulated/0/Android
2021-11-15 17:52 · android / uri
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 44