рд▓рдВрдмреЗ рдкрд░рд┐рдЪрдп рдХреЗ рдмрд┐рдирд╛, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕рд╛рдордЧреНрд░реА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА рдЬреЛ mvvm рдкреИрдЯрд░реНрди рдФрд░ рдХреЛрдЯрд▓рд┐рди рдХреЛрд░рд╛рдЙрдЯреАрди рд╕реЗ рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИ: рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рджреГрд╢реНрдп рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп: рдЧрддрд┐рд╡рд┐рдзрд┐ (рдЦрдВрдб) рд╕реЗ, рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ ViewModel -> ViewModel рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рд╣реИрдВрдбрд▓ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ -> рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рдШрдЯрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЗрд╡ рдбреЗрдЯрд╛ рдХреЛ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ -> рдЙрд╕ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ> рдЬреЛ рд╣рдо рджреГрд╢реНрдп рдХреЛ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
рдШреЛрд╖рдгрд╛рдкрддреНрд░
<manifest ...> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рд╕реЗрдЯрдЕрдк
рдПрдХ Kotlinovsky
NetworkService рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБред рдпрд╣ рд╣рдорд╛рд░рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреНрд▓рд╛рдЗрдВрдЯ - рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реЛрдЧрд╛
рдпреВрдкреАрдбреА рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рд╡реНрдпреБрддреНрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИред
object NetworkService { private const val BASE_URL = " http://www.mocky.io/v2/"
рдЖрдкреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕
рд╣рдо рдирдХрд▓реА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдмрдВрдж рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдордЬрд╝реЗ рдХреЛ рд░реЛрдХрд┐рдП, рдпрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдХреЛрд░рдЯреАрди рдХрд╛ рдЬрд╛рджреВред
рд╣рдо рдХреАрд╡рд░реНрдб
рд╕рд╕реНрдкреЗрдВрдб рдлрд╝рди рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ
...редрд░реЗрдЯреНрд░реЙрд▓рд┐рдЯ рдиреЗ 2.6.0 рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдХреЛрдЯрд▓рд┐рди рдирд┐рд▓рдВрдмрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реАрдЦрд╛, рдЕрдм рдпрд╣ рд╕реАрдзреЗ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
interface Api { @GET("5dcc12d554000064009c20fc") suspend fun getUsers( @Query("page") page: Int ): ResponseWrapper<Users> @GET("5dcc147154000059009c2104") suspend fun getUsersError( @Query("page") page: Int ): ResponseWrapper<Users> }
ResponseWrapper рд╣рдорд╛рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЖрд╡рд░рдг рд╡рд░реНрдЧ рд╣реИ:
class ResponseWrapper<T> : Serializable { @SerializedName("response") val data: T? = null @SerializedName("error") val error: Error? = null }
рджрд┐рдирд╛рдВрдХ рд╡рд░реНрдЧ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ data class Users( @SerializedName("count") var count: Int?, @SerializedName("items") var items: List<Item?>? ) { data class Item( @SerializedName("first_name") var firstName: String?, @SerializedName("last_name") var lastName: String? ) }
ViewModel
рд╣рдо рдПрдХ рд╕рд╛рд░
BaseViewModel рдХреНрд▓рд╛рд╕ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рднреА ViewModel рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ред рдпрд╣рд╛рдБ рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд░рд╣рддреЗ рд╣реИрдВ:
abstract class BaseViewModel : ViewModel() { var api: Api = NetworkService.retrofitService()
рдШрдЯрдирд╛
Google рдХрд╛ рдПрдХ рд╢рд╛рдВрдд рд╕рдорд╛рдзрд╛рди рдПрдХ рдЗрд╡реЗрдВрдЯ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдбреЗрдЯ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд░рд╛рдЬреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдорддреМрд░ рдкрд░ LOADING, SUCCESS рдФрд░ ERRORред
data class Event<out T>(val status: Status, val data: T?, val error: Error?) { companion object { fun <T> loading(): Event<T> { return Event(Status.LOADING, null, null) } fun <T> success(data: T?): Event<T> { return Event(Status.SUCCESS, data, null) } fun <T> error(error: Error?): Event<T> { return Event(Status.ERROR, null, error) } } } enum class Status { SUCCESS, ERROR, LOADING }
рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рджреМрд░рд╛рди, рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рднреЗрдЬрддреЗ рд╣реИрдВред рджреГрд╢реНрдп рдореЗрдВ, рд╣рдо рдШрдЯрдирд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░, рд░рд╛рдЬреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЬреНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдорд╡реАрдЖрдИ рдХрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреИрдЯрд░реНрди рдЙрд╕реА рджрд░реНрд╢рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
ActivityViewModel
class ActivityViewModel : BaseViewModel() {
рдФрд░ рдЕрдВрдд рдореЗрдВ
MainActivity
class MainActivity : AppCompatActivity() { private lateinit var activityViewModel: ActivityViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) activityViewModel = ViewModelProviders.of(this).get(ActivityViewModel::class.java) observeGetPosts() buttonOneClickListener() buttonTwoClickListener() }
рд╕реНрд░реЛрдд рдХреЛрдб