全部 文章 问答 分享 共找到913个相关内容
[文章] C语言入门(3)
语句使用以及注意的相关事项这节内容可能比较多,大家可以在空余时间消化练习.之前的小编没排序,现在排个序:C语言入门(1)-----最简框架C语言入门(2)-----框架解析目录1.变量的命名规则2.变量的输入输出3.
[文章] 3. 数组中重复的数字
3.数组中重复的数字题目描述在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
[文章] 3. 数组中重复的数字
3.数组中重复的数字题目描述在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
[文章] OKHttp3访问接口,结果显示:okhttp3.internal.http.RealResponseBody@5fc8ef2
问题:OKHttp3访问接口,结果显示:okhttp3.internal.http.RealResponseBody@5fc8ef2解决:intcode=response.code();Log.d(TAG
2020-06-08 09:26
·
okhttp
[问答] 关于使用okhttp3的post
想使用OKHTTP3发到京东那边,但是返回信息说图片读取失败,请问用post方式传参不是在requestbody里面用add添加就好了嘛,还是说传出去的图片base64编码的字符串长度太长了?
2020-02-29 13:09
·
okhttp3
[文章] centos7下安装python3并与python2共存
然后使用命令whichpython查看一下Python可执行文件的位置whichpython切换到该目录下执行llpython*命令查看,python指向的是python2.7因为我们要安装python3版本
[问答] 喜马拉雅3 SDK集成中出现了问题
喜马拉雅3SDK集成中出现了MainActivity:errorcode--604errormsg==>网络请求失败,请问这是什么原因?
2019-10-11 15:31
·
喜马拉雅
[问答] Android8.0用OkHttp3报错,而andoird9.0和10.0不报错
:212)2020-03-1412:33:18.7475759-5759/com.cxb.webshopI/zygote: atokhttp3.internal.platform.Platformokhttp3
2020-03-14 12:56
·
OkHttp
[问答] 有没有大佬对安卓系统的launcher3比较了解的
这个是launcher3启动时候的动画页面,这个页面在哪里或者怎么把它去掉
2023-07-24 21:56 · Androidframework
[问答] indicator框架下面的3个fragment能直接提交数据到后台吗?
indicator框架下面的3个fragment,其中1个fragment用来作为加班申请表填写,如果我想用retrofit提交表单到后台,能在fragment类下面直接post实现吗?
2020-05-08 21:29
·
fragment下能否直接提交数据
[文章] Kotlin进阶学习3
写在前面本文上接:Kotlin进阶学习2,在上次的文章里,我们学习了高阶函数。这次我们就来学习如何利用高阶函数简化Android中的各种常见操作,并且学习一下泛型的内容。使用高阶函数简化Android开发既然谷歌一直推荐使用Kotlin作为安卓开发的语言,那么谷歌肯定为我们提供了各种方便使用Kotlin开发的库。接下来我们就尝试自己实现其中的一些功能,以加固高阶函数的理解。简化SharedPreferences的用法在学习如何简化之前,先来看看SharedPreferences的基本用法:调用SharedPreferences的edit()方法获得SharedPreferences.Editor对象向SharedPreferences.Editor()对象中添加数据调用apply方法将添加的数据提交,完成数据存储。在了解了基本用法后,我们就可以尝试用高阶函数来改写了:funSharedPreferences.open(block:SharedPreferences.Editor.()->Unit){valeditor=edit()editor.block()editor.apply()}这段代码不是很难理解。首先我们通过扩展函数向SharedPreferences类中添加了一个open函数,且接收了一个函数类型的参数。由于在函数体内有了SharedPreferences的上下文,所以可以直接调用edit()方法获取SharedPreferences.Editor对象,最后调用我们传入的block()函数,提交即可。那么我们直接来使用一下吧:getSharedPreferences("data",Context.MODE_PRIVATE).open{putString("name","Tom")putInt("age",28)}因为这里的open函数里已经有了SharedPreferences.Editor的上下文了,所以可以直接调用一系列的put方法。当然,谷歌提供的KTX扩展库已经包含了上述的功能,且我们用kotlin创建项目时已经自动导入了该依赖:getSharedPreferences("data",Context.MODE_PRIVATE).edit{putString("name","Tom")putInt("age",28)}可以看到,除了函数名变成了edit之外,没有什么不同的地方。简化ContentValues的用法ContentValues的用法想必大家也不会陌生。主要用于在操作Sqlite数据库的存储和修改方法。具体用法这里就不再演示了,想必大家都知道。在开始之前,先补充一个小的知识点:在kotlin中使用AtoB这样的语法结构会创建一个Pair对象。具体的知识点我们将在下面补充。有了这个知识前提后,我们先来定义一个方法:funcvOf(varargpairs:Pair<String,Any?>):ContentValues{}这里的定义出现了很多新的词汇。首先是vararg,其实就是java里的可变参数列表。意思为我们允许向这个方法传入n个Pair类型的参数,这些参数都会赋值到这个pairs变量上,我们通过for循环就可以解析出来了。之后是Pair类型,Pair类型是一个键值对结构,比较值得庆幸的是ContentValues的key都是字符串类型,我们直接写String就可以了。但value却有很多种,这里的Any?中的Any是Kotlin中所有类的共同基类,类似Java中的Object类,问号表示允许传入空值。接下来就是逻辑部分:funcvOf(varargpairs:Pair<String,Any?>):ContentValues{valcv=ContentValues()for(pairinpairs){valkey=pair.firstvalvalue=pair.secondwhen(value){isInt->cv.put(key,value)isLong->cv.put(key,value)isShort->cv.put(key,value)isFloat->cv.put(key,value)isDouble->cv.put(key,value)isBoolean->cv.put(key,value)isString->cv.put(key,value)isByte->cv.put(key,value)isByteArray->cv.put(key,value)null->cv.putNull(key)}}}核心思路很简单,构建一个ContentValues()对象,然后循环遍历pairs,根据类型依次将数据put进去。需要注意的是,这里我们没有强转,因为这里使用了Koltin中的SmartCast功能,比如when语句进入到Int条件分支后,value就会自动被转换成Int型,不再需要我们转换类型了。有了cvOf()函数后,我们直接来使用一下:valvalues=cvOf("name"to"Thrones","author"to"ee","pages"to20,"price"to20.85)db.insert("Book",null,values)当然,这里的cvOf()已经很好用了,但和高阶函数似乎没有啥关系。我们可以再优化一下:funcvOf(varargpairs:Pair<String,Any?>)=ContentValue().apply{for(pairinpairs){valkey=pair.firstvalvalue=pair.secondwhen(value){isInt->put(key,value)isLong->put(key,value)isShort->put(key,value)isFloat->put(key,value)isDouble->put(key,value)isBoolean->put(key,value)isString->put(key,value)isByte->put(key,value)isByteArray->put(key,value)null->putNull(key)}}}这样,不仅代码更加优雅,也充分运用了我们学习到的高阶函数。当然,KTX库也提供了类似的方法,函数名叫contentValuesOf,使用方法是一样的。泛型入门介绍泛型大家一定不会陌生,Java早就引入了泛型的机制,Kotlin更是很早就支持了泛型。篇幅原因,这里就先只学习一下泛型的基本用法。那什么是泛型呢?泛型其实就是允许我们在不指定具体类型的情况下进行编程,极大地方便了我们的开发和拓展。泛型主要有两种定义方式,泛型类和泛型方法。使用的语法结构都是,当然,T并不是固定的,只是我们约定俗成的一种写法。泛型类要定义一个泛型类,如下:classMyClass<T>{funmethod(param:T):T{returnparam}}可以看到,很简单也很方便。我们要使用的时候,直接这样就可以了:valmyClass=Myclass<Int>()valresult=myClass.method(123)泛型方法如果我们不想定义一个泛型类,可以直接定义一个泛型方法:classmyClass{fun<T>method(param:T):T{returnparam}}可以看到,我们只是把泛型声明写到了方法上而已。使用方法也就进行了改变:valmyClass=MyClass()valresult=myClass.method<Int>(123)其中,Kotlin还允许我们对泛型的类型进行限制,如果我们不想让泛型的类型指定为任意类型的话,可以规定他的上界:classmyClass{fun<T:Number>method(param:T):T{returnparam}}这里意思是说,我们的泛型只能输入数字类型的,如果指定成其他类型肯定会报错。另外,默认情况下所有泛型都是可以指定为可空类型的。因为默认上界是Any?,如果不想这样的话只要将上界改成Any就可以了。mapOf()函数里的to解析——infix函数之前,我们已经使用过很多次AtoB这样的语法结构了。但to并不是一个关键字,能够实现这样的效果是因为Kotlin提供了一种语法糖特性:infix函数,这个函数也不难理解,比如AtoB其实就是A.to(B)的写法。要学习这个函数,我们就从例子开始吧。String类中的startsWith()相信你一定用过,其可以用来判断一个字符串是否是由某个指定参数开头的。虽然这个函数用起来很简单,但我们借助infix函数可以让代码可读性更强:infixfunString.beginsWith(prefix:String)=startsWith(prefix)这个函数很好理解,就是定义了一个String类的拓展函数,其实现就是直接调用startsWith()函数。但加上了infix关键字后,我们就可以使用另一种方式调用这个函数了:if("HelloKotlin"beginsWith"Hello")这样看来,infix函数其实也没什么大不了的,只是让代码更加易读了而已。那么我们直接打开to看看里面是如何实现的吧:可以看到,这里使用定义泛型的方式将to()函数定义到了A类型下,并接收一个B类型的参数。实现就更为简单了,直接构建了一个Pair类型对象,传入了A和B对象。也就是说,AtoB其实就是得到了一个包含了A和B数据的Pair对象。总结这次,我们学习了高阶函数与安卓结合的用法,对泛型做了一个简单的解释。同时也对infix关键字做了简单的介绍。总的来说本次学习是一个过渡,主要用来巩固之前的知识。接下来估计会学习泛型的进阶特性。
[文章] Jetpack学习笔记之ViewModel 补充 (3)
androidx.constraintlayout.widget.ConstraintLayout>2)创建一个带参数的ViewModelclassNumberPlusViewModelWithArg(varnumber:Int):ViewModel(){}3)
[文章] 解决BottomNavigationView控件item多于3个时文字不显示的问题
[toc]解决BottomNavigationView控件item多于3个时文字不显示的问题1.问题展示代码展示:<com.google.android.material.bottomnavigation.BottomNavigationViewandroid
2020-07-20 18:54
·
安卓
[问答] 喜马拉雅项目P3-集成SDK,添加依赖后一直报错
B站课堂的喜马拉雅项目P3,在添加依赖、同步之后一直报错,内容如下:我用的是AndroidStudio3.5.2版本,gradle版本为5.4.1。
[文章] FY-3C/GNOS(风云卫星)掩星数据读取工具类实现(java版本)
2.风云卫星简介风云三号(FY-3)气象卫星是我国的第二代极轨气象卫星,它是在FY-1气象卫星技术基础上的发展和提高,在功能和技术上向前跨进了一大步,具有质的变化,具体要求是解决三维大气探测,大幅度提高全球资料获取能力
[文章] Android 使用Gallery仿3D画廊效果实现
publicclassInviteShareActivityextendsAppCompatActivity{privateint[]ids={R.mipmap.image_1,R.mipmap.image_2,R.mipmap.image_3,
[问答] 央视新闻《快3怎么判断长龙技巧》央视网
快3怎么判断长龙技巧【文财神导师】腾讯Q·929180✅信誉网 yy29.cc✅邀请码22940000✅金牌团队✅永盈计划✅导师单带✅权威认证✅✅万人推荐✅据央视新闻报道:谁才是最厉害的回血导师?
2022-05-04 13:17
·
快3怎么判断长龙技巧
[问答] 有没有大佬搞过类似于人体3D建模 在Android设备上运行的,求一个demo
有没有大佬搞过类似于人体3D建模 在Android设备上运行的,求一个demo
2023-06-05 14:56
·
android
[文章] Kotlin基础学习3
写在前面本文上接:Kotlin基础学习2,在之前学习了Koltin中的Lambda表达式后,今天来学习我感觉能够让Kotlin成为谷歌推荐的安卓推荐编程语言的原因——空指针检查。大伙儿在做安卓的时候,肯定能体会到NullPointerException的恐怖。遇到这种错误,总是不知道错在哪里。而Kotlin通过空指针检查基本解决了这一问题,今天就来学习一下空指针检查。空指针检查通常情况,我们在安卓开发中总是需要对某个控件或变量进行判空,以确保他不会造成空指针异常。但一旦项目的代码量上去了,总会有出错的时候。Kotlin通过在编译时对判空进行检查,虽然这么搞有时候会让代码很难写,但Kotlin还提供了很多的辅助工具方便处理。可空类型系统我们先来看一段代码:fundoStudy(s:String){s.toUpperCase()s.toLowerCase()}这段看上去似乎有着空指针的风险,但实际上是没有的,因为Koltin默认所有的参数和变量都不可为空。所以这里传入的String参数一定不会为空,调用其中的方法自然没有任何问题。如果你尝试给他传入一个null参数,编译器会报错:也就是说,Kotlin将空指针异常的检查提前到了编译时期,如果有空指针异常的风险直接不通过编译,更不要谈运行时报错了。这样就从根本上杜绝了空指针异常。但你看到这里可能会觉得诧异,那我如果真的需要传入一个null值怎么办?Kotlin为我们提供了另外一套可为空的类型系统,即在变量类型后面加上问号即可,如:fundoStudy(s:String?){s.toUpperCase()s.toLowerCase()}但这时候你会发现出现了红点:很正常,因为此时我们的s是有可能为空的,必须排除他为空的可能,如下:fundoStudy(s:String?){if(s!=null){s.toUpperCase()s.toLowerCase()}}这样就完事了,但我们发现,好像和之前用Java没什么区别啊?我不是还得写一堆的判空语句吗。别急,下面来学习Kotlin提供的辅助工具来更轻松的进行判空。判空辅助工具首先来学习最常用的?.操作符,这个符号的意思很好理解——当对象不为空时调用相应的方法,当对象为空的时候就什么都不做,比如我们上面的判空语句:fundoStudy(s:String?){s?.toUpperCase()s?.toLowerCase()}还是很简单的吧?有了他我们就可以极大的简化我们的代码了。学习了?.后,再来学习一个也很常用的?:操作符,这个操作符左右都接收一个表达式,如果左边表达式的结果不为空则返回左边表达式的结果,否则就返回右边的结果,比如:valc=if(a!=null){a}else{b}这段代码的逻辑用?:操作符就可以简化成:valc=a?:b当然,我们也可以将?.和?:一起用起来:fungetTextLength(text:String?)=text?.length?:0这里使用了函数里单行代码的语法糖,并且结合了?.和?:。具体来看,当text为空时,就会返回0值,当text不为空时,就会返回它的长度length。当然,有时候Kotlin的编译器并不是那么智能。有的时候我们已经从逻辑上将空指针异常处理了,但Kotlin的编译器不知道,这时候还是会编译失败。比如以下这段代码:varcontent:String?="hello"funmain(){if(content!=null){printUpperCase()}}funprintUpperCase(){valupperCase=content.toUpperCase()println(upperCase)}这里我们定义了一个可为空的全局变量content,然后在主函数里对其进行了判空处理,当content不为空时才会调用下面的方法输出它的大写值。从逻辑上讲似乎没什么问题,但这段代码无法通过编译。因为printUpperCase()这个方法并不知道外部对content已经进行了判空处理,在调用toUpperCase()方法时还是会认为存在空指针异常。这种情况下,我们可以使用非空断言工具,写法是在对象的后面加上!!,如:funprintUpperCase(){valupperCase=content!!.toUpperCase()println(upperCase)}断言,意思就是告诉编译器,我非常确信这里不会为空,你就不用管了。但这种工具如果自己不够确信的情况下,还是不要随意使用的。万一一个不好,就出了空指针异常。最后,学习一个函数let,通过这个函数的特性可以帮助我们简化空指针检查时的代码。let是一个函数,里面要传入一个Lambda表达式,且会把原始调用对象作为参数传递到Lambda表达式里。那么怎么用他来简化我们的代码呢?如下:fundoStudy(s:String?){s?.toUpperCase()s?.toLowerCase()}这是我们之前的代码,我们使用let函数:fundoStudy(s:String?){s?.let{s->s.toUpperCase()s.toLowerCase()}}再根据之前学习的Lambda表达式的特性,代码进一步简化:fundoStudy(s:String?){s?.let{it.toUpperCase()it.toLowerCase()}}要解释的话其实很简单,当对象不为空的时调用let函数,此时的s对象一定不为空,自然可以随便调用里面的方法了。let函数一般用在判断全局变量的时候。在对全局变量判空时,使用if并不能通过编译,因为全局变量的值随时可能被其他线程修改啊,即使做了判空处理也不能确保他没有空指针风险。Kotlin中的小魔术到这里,我们已经学习了很多Kotlin的基础知识了。最后,我把书上提到的Kotlin中的小魔术也记录一下,学会了这些也会提升我们的编码速度。字符串内嵌表达式一般,我们在Java中连接字符串都会使用+号,但这种方式太繁琐了,一不小心我们就会写错。但Kotlin支持使用字符串内嵌表达式来简化我们的操作。先来看语法规则:"hello${obj.name}nicetomeetyou"可以看到,Kotlin允许我们在字符串中嵌入${}这种语法结构的表达式,并会自动替换这部分内容。如果学过web的话,会发现el表达式也是这样的写法。另外,当表达式中仅有一个变量时,还可以省略大括号:"hello$namenicetomeetyou"接下来我们直接在代码中使用呗,如下:valbrand="Samsung"valprice=1299.9println("Cellphone(brand=$brand,price=$price)")可以看到,无论是易读性还是易写性都上了一层楼,可以说十分方便了。函数的参数默认值如果我们学过C++的话,就会知道C++里是允许在函数上直接给变量一个默认值的。我们的Kotlin也是支持这种写法的。如:funprintParams(num:Int,str:String="hello"){println("numis$num,stris$str")}这里我们就给str指定了默认值hello,当我们调用这个方法时:printParams(123)不传入str的值,输出的结果也会如我们所愿的。这时候我们换换,给num一个默认值:funprintParams(num:Int=100,str:String){println("numis$num,stris$str")}这时候我们怎么调用这个方法呢?像刚才那样的使用肯定是不行的,编译器会认为我们想把一个字符串赋值给第一个num参数,直接类型不匹配。这时候我们就可以使用键值对的写法了,如下:printParams(str="world")这时候就无所谓先后顺序了,毕竟是按键值匹配的。这里我们就提到最开始学习的次构造函数,我们说函数的参数默认值这个功能可以很大程度上替代次构造函数。为什么这么说呢?次构造函数的作用一般是什么呢?就是为类提供更多的赋值方式,方便调用。而我们直接在主构造函数上设置函数默认值能达到一样的效果,这时我们就可以使用任意传参组合了。总结仔细想想这一路的学习,会发现Kotlin借鉴了很多其他语言的优势,优化了Java的一些痛点。总的来说虽然Lambda表达式的使用和理解还是有些难度,但我想在日后更多的使用中会更加巩固这方面的知识吧。ban
- 1
- 2
- 3
- 4
- 5
- 6
- 31
Copyright © 阳光沙滩V1.0.3(2014-) 本网站由程序猿(媛)用爱驱动