Kotlin安卓开发指南_第1页
Kotlin安卓开发指南_第2页
Kotlin安卓开发指南_第3页
Kotlin安卓开发指南_第4页
Kotlin安卓开发指南_第5页
已阅读5页,还剩209页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

什么是Android在AndroidStudio中创建一个项目创建一个TheRecycler使Forecastlist可点击ForecastListAdapter的clicklistenerKotlinAndroid怎么去使用KotlinAndroid实现Flowcontrol和ranges提供一个新的访问SharedPreferences测试你的UnittestingInstrumentationtests如果你觉得Java7是一个过期的语言,并决定找一个更现代的语言代替。恭喜你!就如你知道的,虽然Java8已经发布了,它包含了很多设备过期、几乎没有人使用它们之前我们也不能使用Java8,所以恐什么是什么是\hAndroidStudio,官方的AndroidIDE,就是基于Intellij,作对Java开发者来说,Kotlin是非常直觉化的,并且非常容易学它与我们日常生活使用的IDE无需配置就能完全整合。Android它更加安全:Kotlin是空安全的,也就是说在我们编译时期就处它是函数式的:Kotlin是基于面向对象的语言。但是就如其他很它是高度互操作性的:你可以继续使用所有的你用Java写的代码我们通过我们通过Kotlin我们通过Kotlin得到什么易表现publicclassArtist{privatelongid;privateStringname;privateStringurl;privateStringpubliclonggetId(){returnid;publicvoidsetId(longid){this.id=id;publicStringgetName()return publicvoidsetName(Stringname)= publicStringgetUrl()return publicvoidsetUrl(Stringurl)this.url= publicStringgetMbid()return publicvoidsetMbid(Stringmbid)this.mbid= @OverridepublicStringtoString()return"Artist{""id="+id",name='"+name+'\''",url='"+url+'\''",mbid='"+mbid+'\'' 48.1.1.dataclassvarid:Long,varname:String,varurl:String,varmbid:

这里不能通过编译Artist不能是varnotNullArtist:Artist=//Artist可以是varartist:Artist?=无法编译artist可能是null,我们需要进行处理只要在artistnull时才会打印智能转换if(artist!=null){只有在确保artist不是null使用Elvis操作符来给定一个在是nullvalname=artist?.name?:funfunFragment.toast(message:CharSequence,duration:Int=Toast.LENGTH_SHORT){Toast.makeText(getActivity(),message,3.1.1.fragment.toast("Hello函数式支持1.1.view.setOnClickListener{toast("Helloworld!")AndroidAndroidAndroidAndroidStudioAndroid第一件事就是安装AndroidStudio。就如你知道的,AndroidAndroidStudio是\hIntellijIDEA的插件实现,IntellijIDEA\h转移到AndroidStudio是Android开发者一个重要的改变。首先,\hAndroidStudio了。Kotlin团队也创建了一个针对Eclipse的插\h安装安装Kotlin现。前往AndroidStudio的

Kotlin:这是一个基础的插件。它能让AndroidStudio懂得KotlinAndroidExtensions:Kotlin团队还为Android开发发布了另外一个有趣的插件。这个AndroidExtensions可以因为从Intellij15开始,插件是被默认安装了的,但是你的AndroidStudio可能并没有。所以你需要进入AndroidStudio\hBeginnersCourseinUdacity。我们可能会关注不同的事情,但在在AndroidStudio在AndroidStudio在AndroidStudioCreatenewCreatenew

WeatherWeather下一步,它会让你选择最小的API版本。我们选择API15,因为我们AddnoAddnoBlankBlank

配置配置配置配置 buildscriptbuildscriptext.support_version=ext.kotlin_version=ext.anko_version=repositoriesdependenciesclasspath classpath"org.jetbrains.kotlin:kotlin-gradle- 12.allprojectsrepositories 17.

supportsupport

AndroidExtensionsAndroidExtensionsapplyplugin:'com.android.application'applyplugin:'kotlin-android'applyplugin:'kotlin-android-extensions'android{dependenciescompile"com.android.support:appcompat-v7:$support_version"compile"org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"compile"org.jetbrains.anko:anko-common:$anko_version"buildscriptrepositories{dependenciesclasspath"org.jetbrains.kotlin:kotlin-android- 把把MainActivity转换成KotlinKotlinplugin包含了一个有趣的特性,它能把Java代码转成ConvertJavaConvertJavaFiletoKotlin

我们想再将编写一些代码来测试KotlinAndroidExtensions是否 1.1.import overrideoverridefunonCreate(savedInstanceState:Bundle?)message.text="Hello5. \h的新的内容。如果你有疑问或者想查看代码,请在KotlinforAndroidDevelopersrepository查看。每个章节只要修改了代\h classclass3.1.1.classPerson(name:String,surname: classclassPerson(name:String,surname:String) 5.

openopenclassAnimal(name:classPerson(name:String,surname:String): funfunonCreate(savedInstanceState:Bundle?)

funfunadd(x:Int,y:Int):Intreturnx+3.1.1.funadd(x:Int,y:Int):Int=x+funfunadd(x:Int,y:Int):Intreturnx+3.funfuntoast(message:String,length:Int=Toast.LENGTH_SHORT)Toast.makeText(this,message,3.toast("Hello",voidvoidtoast(Stringvoidvoidtoast(Stringmessage,intToast.makeText(this,message,6.funfunniceToast(message: tag:String=javaClass<MainActivity>length:Int=Toast.LENGTH_SHORT)Toast.makeText(this,"[$className]$message",5.toast("Hello",toast("Hello","MyTag",1.1.toast(message="Hello",length=上编写复杂的String。在上面的例子中,我使用了”[$className]$message”。如你所见,任何时候你使用一 符号就可以插入一个表达式。如果这个表达式有点复杂,你就需要使用一对大括号括起来:”Yournameis${}” 创建一个创建一个创建一个创建一个 dependenciesdependenciescompilefileTree(dir:'libs',include:5. \h valvalforecastList=findViewById(R.id.forecast_list)asforecastList.layoutManager=

符 创建了一个对象的实例TheRecyclerTheRecyclerTheRecyclerTheRecyclerAdapterTheRecycler\h \h\h\h \h\h

classclassForecastListAdapter(valitems:List<String>)overridefunonCreateViewHolder(parent:ViewGroup,viewType:Int):ViewHolder{returnoverridefunonBindViewHolder(holder:ViewHolder,position:Int){holder.textView.text=overridefungetItemCount():Int=classViewHolder(valtextView:TextView): privateprivatevalitems="Mon6/23-Sunny-"Tue6/24-Foggy-"Wed6/25-Cloudy-"Thurs6/26-Rainy-"Fri6/27-Foggy-"Sat6/28-TRAPPEDINWEATHERSTATION-"Sun6/29-Sunny-overridefunonCreate(savedInstanceState:Bundle?)valforecastList=findViewById(R.id.forecast_list)asforecastList.layoutManager=LinearLayoutManager(this)forecastList.adapter=ForecastListAdapter(items)使用一个函数listOf创建一个常量的List(很快我们就会讲到的immutable)。它接收一个任何类型的

(可变长的参数),

valvalvald:Double=valvalvali:Int=位运算也有一点不同。在Android中,我们经常在 ////intbitwiseOr=FLAG1|intbitwiseAnd=FLAG1&//valbitwiseOr=FLAG1orvalbitwiseAnd=FLAG1and

\h字面上可以写明具体的类型。这个不是必须的,但是一个通用的valvali=12//AnvaliHex0x0f一个十六进制的Intvall=3L//Avald=3.5//Avalf=3.5F//Avalvals=valcs[2这是一个字符迭代vals=for(cin7.

valvals="Example"//Avali=23//AnvalactionBar=supportActionBar//AnActionBarinanActivityvalvala:Any=valc:Context=publicpublicclassPersonprivateStringpublicStringgetName()return publicvoidsetName(Stringname)= 9.Personperson=newStringname=publicclassPerson{varname:String=""valperson=Person()="name"valname=publicpublicclasssPersonvarname:String=get()=field="Name: 7.

backingbackingbacking backing1.1.dataclassForecast(valdate:Date,valtemperature:Float,valdetails:String)hashCode()我们可以得到一个hash值,也是从属性中计算出copy()你可以拷贝一个对象,可以根据你的需要去修改里面的

valvalf1=Forecast(Date(),27.5f,"Shinyvalf2=f1.copy(temperature= 些情况下,我们仍然可以修改这些状态。在上一个例子中,你还是可以访 另外一个方法是封装这些类。你可以创建一 类,它封 并且不允许去修改它们的状态。决定哪种方式取决于你。本书中,我不会 valvalf1=Forecast(Date(),27.5f,"Shinyval(date,temperature,details)=valvaldate=valtemperature=valdetails=

forfor((key,value)inmap)Log.d("map","key:$key,3.

a+a-a*a/a%aina!ina+=a-=a*=a/=a%=a[i,a.get(i,a[i_1,…,a.get(i_1,…,a[i]=a.set(i,a[i,j]=a.set(i,j,a[i_1,…,i_n]=a.set(i_1,…,i_n,a==a?.equals(b)?:b===a!=!(a?.equals(b)?:b===1.1.operatorfunequals(other:Any?):

a(i,a.invoke(i,a(i_1,…,a.invoke(i_1,…,valvalx=myList[2]= datadataclassForecastList(valcity:String,valcountry:valdailyForecast:List<Forecast>) operatorfunget(position:Int):Forecast=funsize():Int=5. overrideoverridefunonBindViewHolder(holder:position:Int)with(weekForecast[position])holder.textView.text="$date-$description- 6. 1.1.overridefungetItemCount():Int= 1.1.operatorfunViewGroup.get(position:Int):View=

valvalcontainer:ViewGroup=valview=别忘了去\hKotlinforAndroiddevelopersrepository去查看使使Forecastlist使Forecastlist使Forecastlist可点击使Forecastlist <?xmlversion="1.0"encoding="utf-\h\htools:text="May14,tools:text="LightdatadataclassForecast(valdate:String,valdescription: valhigh:Int,vallow:Int,valiconUrl: privatefunconvertForecastItemToDomain(forecast:Forecast):ModelForecast{returnModelForecast(convertDate(forecast.dt),privatefungenerateIconUrl(iconCode:String):=\h\h \h 1.1.compilepublicpublicinterfaceOnItemClickListeneroperatorfuninvoke(forecast:3. classViewHolder(view:View,valitemClick:OnItemClickListener)RecyclerView.ViewHolder(view)privatevaliconView:privatevaldateView:privatevaldescriptionView:privatevalmaxTemperatureView:privatevalminTemperatureView:initiconView=dateView=descriptionView=maxTemperatureView=minTemperatureView= funbindForecast(forecast:Forecast)with(forecast)dateView.text=descriptionView.text=maxTemperatureView.text=minTemperatureView.text=itemView.setOnClickListener{itemClick(forecast) 27.

publicclassForecastListAdapter(valweekForecast:valitemClick:ForecastListAdapter.OnItemClickListener) overridefunonCreateViewHolder(parent:ViewGroup,viewType:ViewHoldervalview=.inflate(R.layout.item_forecast,parent,returnViewHolder(view, overridefunonBindViewHolder(holder:ViewHolder,position:Int){ 16.

valvalView.ctx:get()= forecastListforecastList.adapter=object:overridefuninvoke(forecast:Forecast) Lambdas简化简化简化简化 publicpublicinterfaceOnClickListenervoidonClick(View3.viewview.setOnClickListener(newpublicvoidonClick(Viewv) Toast.makeText(v.getContext(),"Click", 6.viewview.setOnClickListener(object:OnClickListeneroverridefunonClick(v:View) 5.1.1.funsetOnClickListener(listener:(View)->1.1.view.setOnClickListener({view->1.1.view.setOnClickListener({toast("Click")1.1.view.setOnClickListener(){toast("Click")1.1.view.setOnClickListener{toast("Click")ForecastListAdapterForecastListAdapter的clickForecastListAdapter的click在前面一章,我这么艰苦地写了clicklistener的目的就是更好的publicpublicclassForecastListAdapter(valweekForecast:valitemClick:(Forecast)-> 1.1.classViewHolder(view:View,valitemClick:(Forecast)-> 1.1.valadapter=ForecastListAdapter(result){forecast->toast(forecast.date)} 1.1.valadapter=ForecastListAdapter(result){toast(it.date) 1.1.inlinefun<T>with(t:T,body:T.()->Unit){t.body()

withwith(forecast)dateView.text=descriptionView.text=maxTemperatureView.text=minTemperatureView.text=itemView.setOnClickListener{itemClick(this)8. inlineinlinefunsupportsLollipop(code:()->Unit)if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) 5.supportsLollipopsupportsLollipop3.\h\h\hKotlin\h\h\h\h\hKotlin\h\h\h\h privateprotectedinternalpublic

根据Jetbrains的定义,一个module应该是一个单独的功能性的单位,它应该是可Studio中创建不同的module。在Eclipse中,这 可以认为是在 中的不同的project

1.1.classCprivateconstructor(a:Int){...

1.1.classRequestForecastCommand(privatevalzipCode: datadataclassForecastList(...)funget(position:Int)=funsize()=4.KotlinKotlinAndroidKotlinAndroidKotlinAndroidExtensionsKotlinAndroidKotlinKotlinKotlinAndroidKotlinAndroid

怎么去使用怎么去使用KotlinAndroid怎么去使用KotlinAndroid怎么去使用KotlinAndroidExtensionsAndroid AndroidAndroidAndroid怎么去使用KotlinAndroid如果你还记得,现在项目已经准备好去使用KotlinAndroid repositories dependencies classpath"org.jetbrains.kotlin:kotlin-android- 8. Android或 Android

1.1.import importimportimportAndroidAndroid 1.1.import1.1.view.textView.text=

KotlinAndroidKotlinAndroid 1.1.import \h overrideoverridefunonCreate(savedInstanceState:Bundle?)forecastList.layoutManager=LinearLayoutManager(this)

1.1.import

classclassViewHolder(view:View,valitemClick:(Forecast)->Unit)RecyclerView.ViewHolder(view)funbindForecast(forecast:Forecast)itemView.date.text=itemView.description.text=itemView.maxTemperature.text=itemView.minTemperature.text=itemView.onClick{itemClick(forecast) 13.KotlinAndroidExtensions插件帮助我们减少了很多模版代码,ApplicationApplication单例化和属性的个更简单的访问applicationcontext的方式。ApplicatonApplicatonclassclassApp:Application()companionobjectprivatevarinstance:Application?=funinstance()= overridefunonCreate()instance= 10.

classDelegate<T>:ReadWriteProperty<Any?,T>fungetValue(thisRef:Any?,property:KProperty<*>):T{return...funsetValue(thisRef:Any?,property:KProperty<*>,value:T) classclassExamplevarp:Stringby3.3. LazyObservableVetoableNotNull

值。这是非常有趣的特性,当我们在它们第一次真正调用之前不是必classApp:Application()valdatabase:SQLiteOpenHelperbylazy{overridefunonCreate(){valdb= lazy(LazyThreadSafeMode.NONE){...lazy(LazyThreadSafeMode.NONE){... 1.class1.classViewModel(valdb:MyDatabase)myPropertybyDelegates.observable("")d,old,new-db.saveChanges(this,6.

varvarpositiveNumber=Delegates.vetoable(0)d,old,new-new>=4.Not classApp:Application(){companionobject{varinstance:AppbyoverridefunonCreate(){instance=this10.10. importimportclassConfiguration(map:Map<String,Any?>)width:Intbyheight:Intbydp:IntbydeviceName:Stringby8.confconf="width"to"height"to"dp"to"deviceName"to

privateclassprivateclassNotNullSingleValueVar<T>():ReadWriteProperty<Any?,T>{ overridefungetValue(thisRef:Any?,property:KProperty<*>):T{throw overridefunsetValue(thisRef:Any?,property:KProperty<*>,value:T){GetterprivateclassprivateclassNotNullSingleValueVar<T>():ReadWriteProperty<Any?,T>{privatevarvalue:T?=overridefungetValue(thisRef:Any?,property:KProperty<*>):returnvalue?:throwIllegalStateException("${}"not overridefunsetValue(thisRef:Any?,property:KProperty<*>,value:T){this.value=if(this.value==null)elsethrowIllegalStateException("${}alreadyobjectobjectDelegatesExtfunReadWriteProperty<Any?,T>=4.重新实现重新实现Application classApp:Application(){companionobject{varinstance:AppbyoverridefunonCreate()instance=this companioncompanionobjectvarinstance:Appby3.创建一个创建一个创建一个创建一个 ManagedSqliteOpenHelper

forecastDbHelperforecastDbHelper.use3. publicfunpublicfun<T>use(f:SQLiteDatabase.()->T):Ttryreturnfinally7.

valvalresult=forecastDbHelper.usevalqueriedObject=4.

objectobjectCityForecastTablevalNAME=valID=valCITY=valCOUNTRY=6.objectobjectDayForecastTablevalNAME=valID=valDATE=

DESCRIPTION=HIGH=LOW=ICON_URL=CITY_ID=10.实现实现实现实现

classclassForecastDbHelper(): ForecastDbHelper.DB_NAME,null,ForecastDbHelper.DB_VERSION){4.

companion companioncompanioncompanionobjectvalDB_NAME=valDB_VERSION=valinstance:ForecastDbHelperbylazy{ForecastDbHelper()5.

CREATE CREATE Pair(CityForecastTable.ID,INTEGER+Pair(CityForecastTable.CITY,Pair(CityForecastTable.COUNTRY,

funfunSqlType.plus(m:SqlTypeModifier):SqlTypereturnSqlTypeImpl(name,if(modifier==null)else"$modifier4. 1.1.publicfun<A,B>A.to(that:B):Pair<A,B>=Pair(this,1.1.valpair=object1toCityForecastTable.IDtoINTEGER+CityForecastTable.CITYtoCityForecastTable.COUNTRYtooverrideoverridefunonCreate(db:SQLiteDatabase)CityForecastTable.IDtoINTEGER+CityForecastTable.CITYtoCityForecastTable.COUNTRYtodb.createTable(DayForecastTable.NAME,true,DayForecastTable.IDtoINTEGER+PRIMARY_KEY+DayForecastTable.DATEtoINTEGER,DayForecastTable.DESCRIPTIONtoTEXT,DayForecastTable.HIGHtoINTEGER,DayForecastTable.LOWtoINTEGER,DayForecastTable.ICON_URLtoTEXT,DayForecastTable.CITY_IDtoINTEGER)

overrideoverridefunonUpgrade(db:SQLiteDatabase,oldVersion:Int,newVersion:Int){5.\h\h

classclassForecastDbHelper(ctx:Context=App.instance) ManagedSQLiteOpenHelper(ctx,ForecastDbHelper.DB_NAME,ForecastDbHelper.DB_VERSION)valvaldbHelper1ForecastDbHelper它会使用valdbHelper2ForecastDbHelper(mockedContextCollection:这个类相是一个范性集合。我们通过函数访问可以

MutableList:一个支持增加和删除item的List。Set:一个无序并不支持重复item的集合。Map:一个key-value对的collection。key在map中是唯一anyallcountfoldfoldRightforEachforEachIndexedmaxmaxByminminBynonereducereduceRightsumByvalvallist=listOf(1,2,3,4,5,assertTrue(list.any{it%2==0assertFalse(list.any{it>10assertTrueassertTrue(list.all{it<10assertFalse(list.all{it%2==01.1.assertEquals(3,list.count{it%2==01.1.assertEquals(25,list.fold(4){total,next->total+next 1.1.assertEquals(25,list.foldRight(4){total,next->total+next1.1.list.forEach{println(it) listlist.forEachIndexed{index,->println("position$indexcontainsa$value")1.1.assertEquals(6,////TheelementwhosenegativeisassertEquals(1,list.maxBy{-it1.1.assertEquals(1,////TheelementwhosenegativeisassertEquals(6,list.minBy{-it1.1.//Noelementsaredivisibleby2.2.assertTrue(list.none{it%7==0 1.1.assertEquals(21,list.reduce{total,next->total+next 1.1.assertEquals(21,list.reduceRight{total,next->total+next1.1.assertEquals(3,list.sumBy{it%2dropdropWhiledropLastWhilefilterfilterNotfilterNotNullslicetaketakeLasttakeWhile1.1.assertEquals(listOf(5,6),1.1.assertEquals(listOf(3,4,5,6),list.dropWhile{it<31.1.assertEquals(listOf(1,2,3,4),list.dropLastWhile{it>41.1.assertEquals(listOf(2,4,6),list.filter{it%2==01.1.assertEquals(listOf(1,3,5),list.filterNot{it%2==01.1.assertEquals(listOf(1,2,3,4),1.1.assertEquals(listOf(2,4,5),list.slice(listOf(1,3,1.1.assertEquals(listOf(1,2),1.1.assertEquals(listOf(5,6),1.1.assertEquals(listOf(1,2),list.takeWhile{it<3flatMapgroupBymapmapIndexedmapNotNullassertEqualsassertEquals(listOf(1,2,2,3,3,4,4,5,5,6,6,list.flatMap{listOf(it,it+1)1.1.assertEquals(mapOf("odd"tolistOf(1,3,5),"even"tolistOf(2,4,6)),list.groupBy{if(it%2==0)"even"else"odd"})1.1.assertEquals(listOf(2,4,6,8,10,12),list.map{it*21.1.assertEquals(listOf(0,2,6,12,20,30),list.mapIndexed{index,it->index*it})1.1.assertEquals(listOf(2,4,6,8),listWithNull.mapNotNull{it*containselementAtelementAtOrElseelementAtOrNullfirstfirstOrNullindexOfindexOfFirstindexOfLastlastlastIndexOflastOrNullsinglesingleOrNull1.1. 1.1.assertEquals(2,1.1.assertEquals(20,list.elementAtOrElse(10,{2*it1.1.1.1.assertEquals(2,list.first{it%2==01.1.assertNull(list.firstOrNull{it%7==0 1.1.assertEquals(3, 1.1.assertEquals(1,list.indexOfFirst{it%2==0 1.1.assertEquals(5,list.indexOfLast{it%2==01.1.assertEquals(6,list.last{it%2==0 valvallist=listOf(1,2,3,4,5,assertNull(list.lastOrNull{it%7==01.1.assertEquals(5,list.single{it%5==01.1.assertNull(list.singleOrNull{it%7==0mergepartitionpluszipunzipvalvallist=listOf(1,2,3,4,5,vallistRepeated=listOf(2,2,3,4,5,5,assertEquals(listOf(3,4,6,8,10,11),list.merge(listRepeated){it1,it2->it1+it2})

Pair(listOf(2,4,6),listOf(1,3,list.partition{it%2==04. listOf(1,2,3,4,5,6,7,list+listOf(7,4.

listOf(Pair(1,7),Pair(2,list.zip(listOf(7,4.Pair(listOf(5,6),listOf(7,listOf(Pair(5,7),Pair(6,4.reversesortsortBysortDescendingsortDescendingByvalvalunsortedList=listOf(3,2,7,assertEquals(listOf(5,7,2,3),1.1.assertEquals(listOf(2,3,5,7),1.1.assertEquals(listOf(3,7,2,5),unsortedList.sortBy{it%31.1.assertEquals(listOf(7,5,3,2),1.1.assertEquals(listOf(2,5,7,3),unsortedList.sortDescendingBy{%3 创建数据库创建数据库model this._id=this.city=this.country=14.classCityForecast(valmap:MutableMap<String,valdailyForecast:List<DayForecast>)var_id:Longbymapvarcity:Stringbymapvarcountry:Stringbyconstructor(id:Long,city:String,country:String,dailyForecast:List<DayForecast>):this(HashMap(),dailyForecast)classclassDayForecast(varmap:MutableMap<String,Any?>)var_id:Longbyvardate:Longbyvardescription:Stringbyvarhigh:Intbyvarlow:IntbyvariconUrl:StringbyvarcityId:Longbyconstructor(date:Long,description:String,high:Int,low:iconUrl:String,cityId::this(HashMap()){this.date=datethis.description=descriptionthis.high=highthis.low=lowthis.iconUrl=iconUrlthis.cityId=cityId查询一个forecastdomaindomain

classclass valforecastDbHelper:ForecastDbHelper=valdataMapper:DbDataMapper=DbDataMapper())5.

funrequestForecastByZipCodefunrequestForecastByZipCode(zipCode:Long,date:Long)=forecastDbHelper.use{3.

查询一个 valvaldailyRequest="${DayForecastTable.CITY_ID}=?""AND${DayForecastTable.DATE}>=valdailyForecast=.whereSimple(dailyRequest,zipCode.toString(),.parseList{DayForecast(HashMap(it))

valvaldailyRequest="${DayForecastTable.CITY_ID}={id}"+${DayForecastTable.DATE}>=valdailyForecast=.where(dailyRequest,"id"tozipCode,"date"to.parseList{DayForecast(HashMap(it))

funfun<T:Any>parser:(Map<String,Any>)->T):List<T>parseList(object:MapRowParser<T> overridefunparseRow(columns:Map<String,Any>):T=5. 1.1.parseList{DayForecast(HashMap(it))databasedatabase

immutablemutableimmutablemutable

valvalcity= .whereSimple("${CityForecastTable.ID}=?",.parseOpt{CityForecast(HashMap(it),dailyForecast) publicpublicfun<T:Any>parser:(Map<String,Any>)->T):T?parseOpt(object:MapRowParser<T> overridefunparseRow(columns:Map<String,Any>):T= domain domain 1.1.if(city!=null)dataMapper.convertToDomain(city)elsefunfunconvertToDomain(forecast:CityForecast)=with(forecast)valdaily=dailyForecast.map{convertDayToDomain(it)ForecastList(_id,city,country,4.privatefunconvertDayToDomain(dayForecast:DayForecast)=with(dayForecast){Forecast(date,description,high,low,8.8.funrequestForecastByZipCodefunrequestForecastByZipCode(zipCode:Long,date:Long)=forecastDbHelper.use{valdailyRequest="${DayForecastTable.CITY_ID}=?AND""${DayForecastTable.DATE}>=valdailyForecast= .whereSimple(dailyRequest,zipCode.toString(),.parseList{DayForecast(HashMap(it))valcity=.whereSimple("${CityForecastTable.ID}=?",.parseOpt{CityForecast(HashMap(it),dailyForecast)if(city!=null)dataMapper.convertToDomain(city)else

保存一个

funfunsaveForecast(forecast:ForecastList)=forecastDbHelper.use3.

domaindomainfunfunSQLiteDatabase.clear(tableName:String)execSQL("deletefrom3. 3. funfunconvertFromDomain(forecast:ForecastList)=with(forecast)valdaily=dailyForecast.map{convertDayFromDomain(id,it)CityForecast(id,city,country,4.privatefunconvertDayFromDomain(cityId:Long,forecast:with(forecast)DayForecast(date,description,high,low,iconUrl,

Pair<String,Pair<String,

转换成AndroidSDK

1.1.fun<K,V:Any>MutableMap<K,Array<outPair<K,V>>map({Pair(it.key, mapmap

1.insert(CityForecastTable.1.insert(CityForecastTable.NAME,

1.1.dailyForecast.forEach{*it.map.toVarargArray()) funsaveForecast(forecast:ForecastList)=forecastDbHelper.use{with(dataMapper.convertFromDomain(forecast)){insert(CityForecastTable.NAME,*map.toVarargArray())dailyForecastforEach{insert(DayForecastTable.NAME,KotlinKotlin中的null如果你正在使用Java7工作的话,null安全是Kotlin中最令人感兴\hForecastForecastforecast= 可可null1.1.vala:Int?=valvala:Int?=5.

valorvalorvalvala:Int?= 至可以使用Elvis valvala:Int?=valmyString=a?.toString()?:

valvalmyString=a?.toString()?:returnvalmyString=a?.toString()?:throw valvala:Int?= 可可null性和JavaJava库和AndroidSDK会发生什么呢?在Java中,所有对象可以被

\h\h

\h\h\h \h\h \himportpublicclassNullTestpublicObjectgetObject(){return"";valvaltest=valmyObject:Any= 注解的方式和一些AndrodSDK的知识,我们也很难犯错误。

overridefunonCreate(savedInstanceState:Bundle?)overridefunonCreate(savedInstanceState:Bundle) 检查是否存在对应星期的数据如果有,返回UI并且渲染

interfaceinterfaceForecastDataSource funrequestForecastByZipCode(zipCode:Long,date:Long):3.zipzip

1.1.classForecastProvider(valsources:List<ForecastDataSource>ForecastProvider.SOURCES)companionobjectvalDAY_IN_MILLIS=1000*60*60*valSOURCES=listOf(ForecastDb(),forecastforecast 1.1.funrequestByZipCode(zipCode:Long,days:Int): =sources.firstResult{requestSource(it,days,zipCode)}1.inline1.inlinefun<T,R:Any>Iterable<T>.firstResult(predicate:(T)-throwNoSuchElementException("Noelementmatchingpredicate

:(elementinvalresult=if(result!=null)return7.

T=R=T=R=

funrequestSourcefunrequestSource(source:ForecastDataSource,days:Int,zipCode:ForecastList? valres=source.requestForecastByZipCode(zipCode,returnif(res!=null&&res.size()>=days)reselse5. 1.1.privatefuntodayTimeSpan()=System.currentTimeMillis()/DAY_IN_MILLIS*DAY_IN_MILLISclassForecastProvider(valsources:List<ForecastDataSource>ForecastProvider.SOURCES)companionobjectvalDAY_IN_MILLIS=1000*60*60*valSOURCES=listOf(ForecastDb(), funrequestByZipCode(zipCode:Long,days:Int): =sources.firstResult{requestSource(it,days,zipCode)}privatefunrequestSource(source:RepositorySource,days:zipCode:Long):ForecastList? valres=source.requestForecastByZipCode(zipCode,returnif(res!=null&&res.size()>=days)reselse privatefuntodayTimeSpan()=System.currentTimeMillis()DAY_IN_MILLIS*20.

classForecastDb(valforecastDbHelper:ForecastDbHelper=ForecastDbHelper.instance,valdataMapper:DbDataMapper=:ForecastDataSourceoverridefunrequestForecastByZipCode(zipCode:Long,forecastDbHelper.use10. classclassForecastServer(valdataMapper:ServerDataMapper= valforecastDb:ForecastDb=ForecastDb()):ForecastDataSource{ overridefunrequestForecastByZipCode(zipCode:Long,date:ForecastList?valresult=valconverted=dataMapper.convertToDomain(zipCode,returnforecastDb.requestForecastByZipCode(zipCode, 11.datadatabasedatadatabase

domain domain domaindomain

RequestForecastCommand(valzipCode:valforecastProvider:ForecastProvider=ForecastProvider()):Command<ForecastList>companionobject{valDAYS=7overridefunexecute():ForecastListreturnforecastProvider.requestByZipCode(zipCode,\hAndroidDevelopersrepository查看相应的提交。FlowFlowcontrol和Flowcontrol和Flowcontrol和rangesFlowcontrol和IfIf toast("xisgreaterthan}elsetoast("xequalstoast("xissmallerthan7.1.1.valres=if(x!=null&&x.size()>=days)xelse1.1.valz=if(condition)xelse WhenWhen

whenwhen1->print("x==2->print("x==else->print("I'maprint("xisneither1nor 8. valvalresult=when(x)0,1->else->4.whenwhen(view)isTextView->view.setText("I'maisEditText->toast("EditTextvalue:isViewGroup->toast("Numberof${view.getChildCount()}else->view.visibility=6.valvalcost=when(x)in1..10->in10..100->in100..1000->inspecialValues->"specialelse->"not7. xin1..10->s.contains("hello")->"it'savisViewGroup->"childcount:else->6.ForForforfor(itemincollection)3. forfor(indexin0..viewGroup.getChildCount()-1)valview=view.visibility=4.forfor(iinWhileWhile和do/while while(x>valy=while(ynully在这里是可见的Rangescontrolcontrol

ifif(i>=0&&i<=ifif(iin forfor(iinforfor(iin forfor(iin10downTo

forfor(iin1..4step2)for(iin4downTo1step2) 1.1.for(iin0until4)0until==(i0until==(iin0untilin0..list.size-

1.1.valviews=(0..viewGroup.childCount-1).map{viewGroup.getChildAt(it)}

可以进入\hKotlin datadataclassForecast(valid:Long,valdate:Long,valdescription:valhigh:Int,vallow:Int,valiconUrl:

1.1.privatefun<T:Any>requestToSources(f:(ForecastDataSource)->T?):T =sources.firstResult{f(it) funrequestByZipCodefunrequestByZipCode(zipCode:Long,days:Int):ForecastList=requestToSources{valres=it.requestForecastByZipCode(zipCode,if(res!=null&&res.size()>=days)reselsefunrequestForecast(id:Long):Forecast=requestToSources{1.1.funrequestDayForecast(id:Long):overrideoverridefunrequestDayForecast(id:Long):Forecast?=forecastDbHelper.use{valforecast=parseOpt{DayForecast(HashMap(it)) if(forecast!=null)dataMapper.convertDayToDomain(forecast)elsenull5. 1.1.funSelectQueryBuilder.byId(id:Long): =whereSimple("_id=?",

1.1.overridefunrequestDayForecast(id:Long): =throw 是表达是非常重要的,当你使 处理边界的问题或者当抛出异常的时候。

valx=in0..10->in11..20->else->throwvalx=try{doSomething()}catch{nullclassclassvalid: valforecastProvider:ForecastProvider=ForecastProvider()):Command<Forecast>overridefunexecute()=6. 提供一个新的提供一个新的提供一个新的提供一个新的

forecastforecastpublicpublicclassDetailActivity:AppCompatActivity()companionobjectvalID=valCITY_NAME= 7. \h\htools:text="Few

title=asyncasync valresult=RequestDayForecastCommand(intent.getLongExtra(ID,-1)).execute()uiThread{bindForecast(result)4. importpri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论