JetPackコンポーネントベースのMVVMフレームワークを簡単に構築
Brick
github gitee
紹介する
Android開発者がJetPackコンポーネントに基づいてMVVMフレームワークを構築する注釈処理フレームワークの構築を支援する.注記によって自動的にViewModelのFactoryクラス、lazyメソッドなどを生成します.プロジェクトの任意の場所にROMを注入するdaoレイヤインタフェースとRetrofitライブラリ内のapiインタフェースをサポートします.
特長
適用範囲は、 は、 は、 は、 サービス側は、マルチポート、マルチIPの項目である.(オプション) 導入 androidエンジニアリングのルートディレクトリのbuild.gradleファイルの適切な場所に次のコードを追加します: あなたのandroidエンジニアリングでbrickのandroidモジュールを有効にするbuild.gradleファイルの適切な場所に次のコードを追加します:
使用
一、@Provide注記の使用方法:あなたが作成したViewModelサブクラスに@Provide注記 を追加 brick注釈プロセッサを動作させるには3つの方法があります: Terminal端末に Android Studioの右側のGradle拡張バーで スクリプトの実行が終了すると、 という2つのパケット・レベル・メソッドが生成されます.
またはonCreate()の後にgetで作成します.
二、@Inject注記の使い方
-2.必要に応じて、
注:
-1.オプションとして、
注:は、 があると仮定する. WxAuthorRepoに ViewModelで と表記します.
タグ付け後、ビジネスコードの作成を続行すれば、
三、マルチサーバー或いはマルチポートの処理方法:
アクセスアドレスまたはポートが
この注釈を追加すると、brickはコンパイル中に
付録1
生成された
付録2
逆コンパイル後の
付録3
逆コンパイル後の
付録4
まとめ
github gitee
紹介する
Android開発者がJetPackコンポーネントに基づいてMVVMフレームワークを構築する注釈処理フレームワークの構築を支援する.注記によって自動的にViewModelのFactoryクラス、lazyメソッドなどを生成します.プロジェクトの任意の場所にROMを注入するdaoレイヤインタフェースとRetrofitライブラリ内のapiインタフェースをサポートします.
特長
android
は、brick
を軽量レベルの注入フレームワークとして理解することができ、使用は非常に簡単であり、4〜6個の注釈を用いて動作することができる.brick
は主にコンパイル期間中に動作し、App
の実行時に追加のパフォーマンス消費を生じず、ボリュームの増大の問題を心配することなく、1つの注釈ライブラリだけがandroid
プロジェクトにパッケージされます.適用範囲
androidx
ライブラリではなくsupport
ライブラリを使用します.JetPack
のViewModel
組立体を使用する.Retrofit
をネットワーク要求ライブラリとして使用する.ROOM
データベース・フレームワークを使用します.(オプション)buildscript {
...
ext {
brick_version = '0.2.0'
}
repositories {
...
maven { url 'https://jitpack.io' }
}
dependencies {
classpath "com.gitee.numeron.brick:plugin:$brick_version"
}
}
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
...
apply plugin: 'kotlin-kapt'
apply plugin: 'brick'
...
dependencies {
...
implementation "com.gitee.numeron.brick:annotation:$brick_version"
kapt "com.gitee.numeron.brick:compiler:$brick_version"
}
使用
一、@Provide注記の使用方法:
@Provide
class WxAuthorViewModel: ViewModel() {
...
}
gradlew :[ModuleName]:kaptDebugKotlin
実行スクリプトを入力する.[PrjectName] -> [ModuneName] -> Tasks -> other -> kaptDebugKotlin
を順に見つけ、実行スクリプトをダブルクリックします.Ctrl + F9
プロジェクト全体をコンパイルします.以上の3つの方法のいずれかを選択してbrick注釈プロセッサを実行します.lazyWxAuthorViewModel()
拡張メソッドは、ActivityまたはFragmentで直接呼び出せばよい.get()
メソッドは、lazyメソッドの使用が不便な場合に、このメソッドを使用してViewModelのインスタンスを取得できます.注:lazyWxAuthorViewModel
方法はget()
方法の包装です.生成メソッドを直接使用すると、対応するViewModelインスタンスを作成できます:private val wxAuthorViewModel by lazyWxAuthorViewModel()
またはonCreate()の後にgetで作成します.
private lateinit var wxAuthorViewModel: WxAuthorViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
wxAuthorViewModel = get(this)
}
二、@Inject注記の使い方
-2.必要に応じて、
Retrofit
のインスタンスを取得する方法に@RetrofitInstance
を追加する.@RetrofitInstance
val retrofit: Retrofit by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
Retrofit.Builder()
.client(okHttpClient)
.baseUrl(WANDROID_BASE_URL)
.addConverterFactory(MoshiConverterFactory.create())
.build()
}
val okHttpClient: OkHttpClient by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
val logInterceptor = HttpLoggingInterceptor()
logInterceptor.level = HttpLoggingInterceptor.Level.BODY
OkHttpClient.Builder()
.addInterceptor(logInterceptor)
.callTimeout(15, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.connectTimeout(15, TimeUnit.SECONDS)
.build()
}
注:
@RetrofitInstance
注記は、public
によって修飾されたval
属性またはメソッドにのみマークされます.val
属性またはメソッドは、object
またはcompanion object
においても、パケットレベル属性/メソッドであってもよい.-1.オプションとして、
RoomDatabase
のインスタンスを取得する属性または方法には、@RoomInstance
、例えば、@RoomInstance
val wandroidDatabase: WandroidDatabase by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
Room.databaseBuilder(CONTEXT, WandroidDatabase::class.java, "wandroid.db")
.build()
}
注:
@RoomInstance
注記は、public
によって修飾されたval
属性またはメソッドにのみマークされます.val
属性またはメソッドは、object
またはcompanion object
においても、パケットレベル属性/メソッドであってもよい.Retrofit Api
インターフェースおよびWxAuthorRepo
クラスinterface WxAuthorApi {
@GET("wxarticle/chapters/json ")
suspend fun getWxAuthorList(): List
}
class WxAuthorRepo {
...
}
lateinit var
で修飾されたWxAuthorApi
フィールドを追加し、@Inject
でマーク:class WxAuthorRepo {
@Inject
lateinit var wxAuthorApi: WxAuthorApi
}
lateinit var
修飾WxAuthorRepo
フィールドを作成し、@Inject
で@Provide
class WxAuthorViewModel: ViewModel() {
@Inject
private lateinit var wxAuthorRepo: WxAuthorRepo
}
タグ付け後、ビジネスコードの作成を続行すれば、
@Inject
タグ付けされたすべてのフィールドは、コンパイル中にインスタンスが自動的に取得または作成され、いつ値付けされるか心配する必要はありません.注意:lateinit var
修飾フィールドですが、値を付けてはいけません.これは致命的なエラーを引き起こします.注意:@Inject
が注入できるタイプは、Retrofit
のapi
インタフェースとROOM
のdao
インタフェース、およびパラメトリック構造の有無のクラスのみです.三、マルチサーバー或いはマルチポートの処理方法:
アクセスアドレスまたはポートが
baseUrl
と異なる別のRetrofit apiインタフェースがあると仮定すると、Retrofit
のapi
インタフェースに@Port
および@Url
注釈を追加してurlまたはportを設定することができる.@Port
の使用:@Port(1080)
interface ArticleApi {
@GET("wxarticle/list/{chapterId}/{page}/json")
suspend fun getArticleList(@Path("chapterId") chapterId: Int, @Path("page") page: Int): Paged
}
この注釈を追加すると、brickはコンパイル中に
@RetrofitInstance
注釈タグのRetrofit
インスタンスと@Port
ポート番号に基づいて、Retrofit
インスタンスを再作成し、新しいRetrofit
インスタンスを使用してArticleApi
インスタンスを作成します.@Url
の使用:@Url("http://www.wanandroid.com:1080/")
interface ArticleApi {
@GET("wxarticle/list/{chapterId}/{page}/json")
suspend fun getArticleList(@Path("chapterId") chapterId: Int, @Path("page") page: Int): Paged
}
@Port
の使用とほぼ一致し,実現の原理も同様である.付録1
生成された
WxAuthorViewModels.kt
ファイル://kotlin , Activity/Fragment by
fun ViewModelStoreOwner.lazyWxAuthorViewModel(): Lazy =
LazyWeChatAuthorViewModel(this)
// , Activity/Fragment onCreate
fun get(owner: ViewModelStoreOwner): WxAuthorViewModel {
val factory = WxAuthorViewModelFactory()
return ViewModelProvider(owner, factory).get(WxAuthorViewModel::class.java)
}
private class WxAuthorViewModelFactory : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun create(clazz: Class): VM = WxAuthorViewModel() as VM
}
private class LazyWxAuthorViewModel(
private val owner: ViewModelStoreOwner
) : Lazy {
private var _value: WxAuthorViewModel? = null
override val value: WxAuthorViewModel
get() {
if(_value == null) {
_value = get(owner)
}
return _value!!
}
override fun isInitialized(): Boolean = _value != null
}
付録2
逆コンパイル後の
WxAuthorViewModel.class
:class WxAuthorViewModel extends ViewModel {
private final WxAuthorRepo wxAuthorRepo = new WxAuthorRepo();
}
付録3
逆コンパイル後の
WxAuthorRepo.class
:class WxAuthorRepo {
private final WxAuthorApi wxAuthorApi = RuntimeKt.getRetrofit().create(WxAuthorApi.class);
public final WxAuthorApi getWxAuthorApi() {
...
return wxAuthorApi;
}
}
付録4
WxAuthorApi
@Port
注記を追加したWxAuthorRepo.class
:class WxAuthorRepo {
private final WxAuthorApi wxAuthorApi = newRetrofit(RuntimeKt.getRetrofit(), 1080, null).create(WxAuthorApi.class);
public final WxAuthorApi getWxAuthorApi() {
...
return wxAuthorApi;
}
private final Retrofit newRetrofit(Retrofit retrofit, int port, String url) {
if (port > 0) {
HttpUrl httpUrl = retrofit.baseUrl().newBuilder().port(port).build();
return retrofit.newBuilder().baseUrl(httpUrl).build();
} else if(url != null && url.length() != 0) {
return retrofit.newBuilder().baseUrl(url).build();
}
return retrofit;
}
}
まとめ
class
を逆コンパイルした後のコードと、文章全体を逆コンパイルした後、brick
はjava
をclass
にコンパイルした後、class
をdex
にコンパイルする前に、class
のバイトコードを修正し、@Inject
にマークされたフィールドに値を付け、実現した注入フレームワークであると大まかな結論が得られる.現在、ViewModel
への注入は、生成方法を手動で呼び出して初期化する必要があります.これは、コードをコンパイルする前にASに赤いエラーマークが付いています.次に、@Inject
にViewModel
の作成をサポートさせることが主な仕事です.完了したら、文章を送りましょう.