Similar presentations:
Разработка современных мобильных приложений под Android
1.
“Разработка современныхмобильных приложений под Android”
Панчуков Михаил
Точка кипения°
2.
KotlinRoom
Instan
t app
3.
Kotlin4.
“Now official”Подробнее: https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-nowofficial/
5.
KotlinСтатически типизированный язык
“Null safety”
100% совместим с Java
Прост в изучении
Встроенная поддержка начиная с Android Studio 3.0
6.
+ ЛаконичностьJava
Kotlin
Button b = view.findViewById(R.id.btn1);
b.setOnClickListener(new
View.OnClickListener(){
@Override
public void onClick(View view) {
//your action
}
});
val b: Button = findViewById(R.id.btn1)
b.setOnClickListener{
//your action
}
// или вместе с kotlin android
extensions
btn1.setOnClickListener{
//your action
}
Подробнее: https://kotlinlang.org/docs/tutorials/android-plugin.html
7.
+ Data-классыdata class Book(var title: String, var price: Int)
+ equals() и hashCode()
+ toString() в виде “Book(title=Kotlin in Action,
price=1000)”
+ copy()
+ componentN() для удобной деструкторизации класса
val (title, price) = book
Подробнее: https://kotlinlang.org/docs/reference/data-classes.html
8.
+ Extension функцииfun <T : View> Activity.byId(@IdRes id: Int): T = findViewById(id)
// вызов
val btn = byId<Button>(R.id.btn);
Подробнее: https://kotlinlang.org/docs/reference/extensions.html
9.
+ Extension функцииval books = listOf(
Book("Kotlin in Action", 1000),
Book("Programming Kotlin", 1500)
)
books.sortBy { it.price }.forEach{ it.price += 100 }
10.
+ Поддержка в Android StudioCtrl+Shift+Alt+K
Подробнее: https://developer.android.com/kotlin/get-started.html
11.
+ Поддержка в Android Studiopublic class Book {
private String title;
private Integer price;
public Book(String title, Integer price) {
this.title = title;
this.price = price;
}
private Integer getPriceWithDiscount(Integer discountSize) {
return price - discountSize;
}
public
public
public
public
String getTitle() { return title; }
void setTitle(String title) { this.title = title; }
Integer getPrice() { return price;}
void setPrice(Integer price) { this.price = price }
}
Подробнее: https://developer.android.com/kotlin/get-started.html
12.
+ Поддержка в Android Studioclass Book(var title: String?, var price: Int?) {
private fun getPriceWithDiscount(discountSize: Int?): Int {
return price!! - discountSize!!
}
}
//Но можно и лучше
class Book(var title: String?, var price: Int?) {
private fun getPriceWithDiscount(discountSize: Int?): Int = price!! discountSize!!
}
Подробнее: https://developer.android.com/kotlin/get-started.html
13.
+ Поддержка в Android Studio● возможность декомпилировать код и посмотреть его в
байт коде или на Java
Menu > Tools > Kotlin > Show Kotlin Bytecode > Decompile
● множество подсказок компилятора
Подробнее: https://developer.android.com/kotlin/get-started.html
14.
Минусы-
Небольшое число книг, особенно на русском (всего 6)
Увеличение размера apk: к debug apk прибавляется ~ 7,000 методов и
+1 Mb к итоговому размеру
Увеличение времени компиляции (особенно при использовании kapt)
15.
Room
16.
RoomОсновные компоненты Room:
● Database
● Entity
● DAO
17.
Room - подключениеДобавьте следующие Gradle зависимости:
compile 'android.arch.persistence.room:runtime:1.0.0'
// при работе с RxJava
compile 'android.arch.persistence.room:rxjava2:1.0.0'
//при использовании Kotlin
kapt 'android.arch.persistence.room:compiler:1.0.0'
//при использовании Java
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
18.
Entity@Entity(tableName = "book")
data class Book(
@PrimaryKey(autoGenerate = true)
var id: Long,
var title: String,
@ColumnInfo(name = "page_count")
var pageCount: Int
)
19.
EntityТакже поддерживаются следующие аннотации:
● @Ignore - поле, с такой аннотацией не сохраняется в БД
● @Embeded - позволяет сохранять в БД вложенные классы
● @ForeignKey - позволяет определить внешний ключ для другой таблицы
в БД
20.
DAO@Dao
interface BookDao{
@Query("SELECT * FROM book")
fun getAll(): List<Book>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertBook(book: Book)
@Update
fun updateBook(book: Book)
@Delete
fun delete(book: Book)
}
21.
DAOПростой запрос с параметрами:
@Dao
interface BookDao{
@Query("SELECT * FROM book WHERE page_count == :pageCount")
fun getBookByPageCount(pageCount: Int): List<Book>
}
22.
DAOjava.lang.IllegalStateException
Cannot access database on the main thread
since it may potentially lock the UI for a
long period of time
23.
DAOЕсть встроенная поддержка RxJava и Android LiveData
@Query("SELECT * FROM book WHERE id = :id")
Asynchronous queries
fun getBookById(id: Long): Maybe<Book>
fun getBookById(id: Long): Single<Book>
Observable queries
fun getBookById(id: Long): LiveData<Book>
fun getBookById(id: Long): Flowable<Book>
24.
Database@Database(entities = arrayOf(Book::class), version = 1)
abstract class App1Database: RoomDatabase(){
abstract fun bookDao(): BookDao
}
val bookDb = Room.databaseBuilder(applicationContext,
App1Database::class.java, "book-database").build()
25.
МиграцииПредположим, вам нужно добавить новое поле в модель класса Book:
@Entity(tableName = "book")
data class Book(
//…
var description:String,
//…
}
26.
Миграции1) Повысить версию БД
@Database(entities = arrayOf(Book::class), version = 2)
abstract class AppDatabase: RoomDatabase(){
//…
1) Добавить в класс БД статическое поле с нашей миграцией
companion object {
@JvmField
val MIGRATION_1_2 = Migration1To2()
}
27.
Миграции3) Определить класс миграции, расширяющий класс Migrate
class Migration1To2 : Migration(1,2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALERT TABLE book" +
"ADD COLUMN description STRING")
}
}
4) Добавить миграцию как параметр в databaseBuilder:
Room.databaseBuilder(applicationContext, App1Database::class.java, "book-database")
.addMigrations(MIGRATION_1_2)
.build()
28.
ИтогиМеньше "boilerplate" кода*
● Проверка запросов к базе данных во время компиляции
● Простые миграции
● Запрет на работу с БД в главном потоке
boilerplate - шаблонный, повторяющийся код
29.
Instantapp
30.
Новый способ поиска приложенийСейчас:
Поис
к
Установк
а
Использова
ние
31.
Что такое Instant appInstant app возможность скачать
только нужную Вам
функцию, а не всё
приложение целиком.
32.
ПоддержкаAndroid 5.0 (API level 21) +
33.
Требования● Android Studio 3 и новее
● Самые новые версии Google Support Library
● Instant Apps Development SDK
34.
ОграниченияОграниченный набор доступных разрешений
Все запросы из приложения должны идти по https
Приложения проверяются значительно жестче
Если нужна
Подробнее: https://developer.android.com/topic/instant-apps/faqs.html
https://developers.google.com/identity/smartlock-passwords/android/
35.
“Приложение как фича”Каждый apk: ● это одна activity
● это одно законченное
действие
● не более 4Mb
36.
ИспользованиеBase feature module
Instant app module
apply plugin:
'com.android.feature'
android {
...
baseFeature true
...
}
apply plugin: 'com.android.instantapp'
...
dependencies {
implementation project(':base')
// if there additional features, they go here
implementation project(':feature1')
}
37.
KotlinRoom
Instan
t app