最近、kotlin を徹底的に勉強しましたが、特にコルーチンが非常に優れていることがわかり、これまで Android 開発でスレッドを使用する習慣が変わりました。これは使いやすく、あらゆる種類のコールバックを保存しますメインスレッドとサブスレッド間の通信の問題。もちろん、Java に慣れている場合は、Kotlin に切り替えてコルーチンを使用してプロジェクトを変換する場合、コストは依然としてかなり高くなります。Google は徐々に Java を kotlin に置き換えており、Android サポート パッケージも androidx に置き換えています。MVP も過去 2 年間で非常に人気のあるデザイン パターン (および MVVM) です。この傾向に追いつくために、このチュートリアルではkotlin ベースの +MVP+AndroidX の Android プロジェクトの基本フレームワークを構築することで、初心者でもプロジェクトを構築するプロセスを理解できるようになります。新しいプロジェクトを開始している場合、またはプロジェクトのリファクタリングを計画している場合は、このチュートリアルが役立つことを願っています何らかの参考値。
その前に、次の知識をある程度理解しておく必要があります。
1. Kotlin (特にコルーチン。Baidu で多くのドキュメントを見つけることができるため、ここでは詳しく説明しません)
2. MVP デザイン パターン (私の他のブログ: Android MVP デザイン パターンを参照してください)
実際、コルーチンを使用するには MVVM の方が便利です。Kotlin はアーキテクチャ コンポーネント ViewModel を適切にサポートしていますが、インターネット上にはすでに MVVM の例がたくさんあります。ここでは MVP の使用方法について書きます。
RxJava を使用しない理由は聞かないでください。RxJava が気に入らないだけです (コルーチンを追加すると、変換コストが少し高くなり、十分エレガントではありません)。
開発ツール:
Android Studio 3.2+ (AS3.5を使用)
1. プロジェクトを作成する
プロジェクトを作成し、基本言語として kotlin を選択します (AS が自動的に kotlin を構成し、AS3.5 はデフォルトで AndroidX を使用します)。MVP デザイン パターンを使用するのは明らかなので、次のようにプロジェクト構造を設計します。
この仕様は次を参照できます: Android 開発仕様
2. AndroidXの移行
Google は公式に、SDK 28.0.0 バージョンはまだ使用されていると述べていますandroid.support,
が、それ以降のバージョンでは androidx が使用されるため、近い将来には影響はないかもしれませんが、将来のバージョンの変更に適応するためには、間違いなく良いことです。これから徐々に androidx に接続し始めます。良いことです。しかし、現時点では、多くのサードパーティ ライブラリが依然としてサポート バージョンを使用しているため、移行にいくつかの問題が生じています。サポートと androidx の間の完全なマッピング関係については、公式ドキュメントを参照してください。
1. すでにプロジェクトがある場合、AndroidStudio3.2 以降では、以下に示すように、ワンクリック移行機能が提供されます。
2. 移行する前に、プロジェクトの Gradle バージョンが 3.2.0 以降であり、compileSdkVersion が 28 以降であることを確認してください。
classpath 'com.android.tools.build:gradle:3.5.2'
3. gradle.properties ファイルに構成を追加します。
android.useAndroidX=true
android.enableJetifier=true
android.useAndroidX
: に設定するとtrue
、Android プラグインはサポート ライブラリの代わりに、対応する AndroidX ライブラリを使用します。指定しない場合、フラグはデフォルトで になりますfalse
。android.enableJetifier
: に設定するとtrue
、Android プラグインはバイナリを書き換えて、既存のサードパーティ ライブラリを AndroidX を使用するように自動的に移行します。指定しない場合、フラグはデフォルトで になりますfalse
。
4. 古いプロジェクトから support.appcompat 依存関係を削除し、次の依存関係を追加します。
implementation "androidx.appcompat:appcompat:1.0.2"
この時点で移行は完了です
注意点:
1. サポート パッケージのコントロールはレイアウト ファイルで参照されており、パッケージ名を手動で androidx に変更する必要があります
2. サードパーティのライブラリを導入して androidx をサポートしているかどうかを確認し、サポートしている場合はその新しいバージョンを直接導入します
3. kotlinの移行
私の他のブログを参照してください: AndroidStudio による kotlin の構成
kotlin プラグインのバージョンには gradle のバージョンの要件もあるので、対応関係に注意してください。
//kotlin依赖
implementation "androidx.core:core-ktx:+"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.60"
//使用协程
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2"
4. プロジェクトの構成
(1) 使用するサードパーティ ライブラリを指定します。このプロジェクトでは以下のサードパーティ ライブラリを使用します。バターナイフ、Glide などの一般的なフレームワークは個別のニーズに応じて追加されます。これは単なるサンプル プロジェクトです。これらの人気のあるフレームワークは規模が大きいことは注目に値します。一部のフレームワークは androidx をサポートし始めており、これは良いことです。
//OkHttp
implementation 'com.squareup.okhttp3:okhttp:4.2.2'
//今日头条屏幕适配方案
implementation 'me.jessyan:autosize:1.1.2'
//权限申请
implementation 'me.weyye.hipermission:library:1.0.7'
(2) プロジェクトに必要な基本的な権限を入力します(実際の開発では必要に応じて増加します)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
(3) 各 Android バージョンの適応構成については、「Android バージョン適応ツアー」を参照してください。
(4) 難読化ルールの構成 参考:Androidコードの難読化(実際の開発で継続的に改善)
5. 基本クラスを作成する
プロジェクトでは、通常、いくつかの共通操作をカプセル化するためにいくつかの基本クラスが作成されます。
6. 梱包ツール
utils パッケージの下に一般的に使用されるいくつかのツール クラスを作成し、いくつかの一般的なツール メソッドをカプセル化します。
7.MVP
MVP にはモデル、ビュー、プレゼンターが含まれます
モデル: データ ソースを取得するために、ネットワーク、データベース、ファイルの読み取りおよび書き込み操作などを保存するために使用されます。
View: アクティビティ、フラグメント、アダプターなどに対応し、UI 操作のみを実行し、ネットワーク リクエストなどの時間のかかる操作は行いません。
プレゼンター: モデルによって提供されるメソッドを実行してデータを取得し、それをバインディング表示のためにビューに渡します。
詳細については、プロジェクトのソースコードを参照してください
基本的にはこのようなシンプルなプロジェクトフレームワークが構築されており、ビジネスロジックをあまり持たない単なる実証プロジェクトであり、個々の状況に応じて柔軟に対応できます。
追記:kotlinコルーチンについて
1. コルーチンのスコープ
GlobalScope:グローバル スコープに相当し、特定のアクティビティまたはフラグメントのライフ サイクルに関連付けられていないため、乱用するとメモリの無駄が発生します。
MainScope:ローカル使用の範囲として理解され、Activity のライフサイクルなどに関連付けることができます。
ViewModelScope: MVVM アーキテクチャ専用で、ViewModel を使用するプロジェクトはこれを直接使用できます。
カスタムスコープ:
private val viewModelJob = SupervisorJob()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob) //UI作用域
uiScope.launch {//主线程(UI线程)
val deferred = async(Dispatchers.IO){//异步线程(IO线程)
delay(2000)
"result"
}
showToast(defferred.await())//UI操作
}
}
2. コルーチンをキャンセルする
コルーチンの作成後、アクティビティのライフサイクルが終了するときに cancel() を呼び出してキャンセルすることに注意してください。
viewModelJob.cancel()
上記は MVP パターンに基づくアーキテクチャですが、次に、これを MVVM パターンに変換し、Lifecycle、LiveData、ViewModel などのアーキテクチャ コンポーネントを導入する方法を段階的に説明します。