エーテル坊アンドロイド財布シリーズ3-資産情報展示をどのように開発するか


本文は深入浅出区ブロックチェーンコミュニティの原文リンクに先発します:以太坊安卓財布シリーズの第3編を開発して、原文はすでに更新して、読者に原文に行って読んでもらいます
深入浅出ブロックチェーンメインステーションに行って、最新の内容を入手してください.
これはどのようにエーテル坊(Android)財布シリーズの第3編を開発して、財布の口座の資産の情報は展示して、展示の情報は主に口座の住所、eth残高とこの口座が持つTokenと残高を含みます.

予備知識MVVM


この文書では、UIインタフェースとのインタラクションについて説明します.インタフェースとデータがどのようにインタラクションするかを事前に理解する必要があります.MVVMに詳しい場合は、このセクションをスキップします.
最初にAndroidを書いたとき、データとインタフェースはよく結合されていて、Activityファイルはいつも大きくて、製品インタフェースが改版するたびにとても苦しくて、ツッコミの下で、多くの製品マネージャーはインタフェースを改めるのが好きです.
その後、Googleは複数のアーキテクチャモデルを推薦した:MPV、MVVMモードはデータとUIの結合の問題を解決し、チェーン財布コードはMVVMモードを使用しているので、簡単に紹介します.以下はMVVMのビューとデータのインタラクティブな図です.
Viewは通常、Activity/Fragment/カスタムView Modelに対応します.データに関連するモジュールです.
ViewModelとModelは直接連絡を取らず、ViewModelがViewレイヤのイベントを受信してデータを取得して処理することを担当し、ViewModelレイヤのデータの変化もViewレイヤに通知して対応するUIの更新を行い、ビジネスロジックとUIの分離を実現する.
MVVMモードを使用する最大の利点は、データ処理ロジックがViewとは独立しているため、UIが変更された場合、View Modelはあまり変更しなくてもよいため、デカップリングです.
GoogleがI/O大会で発表したMVVM開発モデルに準拠したLiveDataとViewModelコンポーネントアーキテクチャを使用しました.

ViewModelとLiveData


ViewModelはUIのライフサイクルに注目してデータを格納し、管理します.Activityが変化すると(画面をロックして画面を開き、回転する)、ViewModelは自動的に前のデータを保持し、新しいActivityまたはFragmentに使用します.インタフェースがシステムによって破棄されると、ViewModelもリソースの整理を行い、メモリの漏洩を回避します.
ViewModelは、異なるインタフェース間のデータ共有にも使用できます.
LiveDataは、観察可能なデータ所有者クラスです.観察者は、非同期でデータを取得するのに便利であり、LiveDataにもライフサイクルが感知されています.ライフサイクルがSTARTEDまたはRESUMEDの場合.LiveDataは,観察者を活動状態と見なし,そのデータの変化を通知する.LiveDataが登録されていないオブジェクトや非アクティブなオブジェクトは、更新に関する通知を受けません.
詳細については、Lifecycle、ViewModel、LiveDataなどのキーワードで検索できます.

アカウント情報展示


展示情報は主にアカウントアドレス、eth残高及びそのアカウントが持つToken及び残高を含み、そのインタフェース効果は以下の通りである.
このインタフェースはチェーン財布のはずですPropertyFragment、上図のUPTは自分で発行したTokenなので、価格は表示されていません
今、上のデータをどのように表現するかを考えてみましょう.焦らずに下を見て、まず考えてみましょう.
まず問題を分割し、データを4つの部分に分割します.
  • 現在選択されているアカウントを表示する
  • 現在のアカウントETH残高
  • を表示する
  • 現在のアカウントの下でTokenの数を表示する
  • には、対応するフランスドルの金額が表示されます.

  • UIと上の4つのデータの結合を避けるために、コードはTokensViewModelを使用し、取得したデータはLiveDataでWrapを作成し、UIがデータを購読できるようにした.TokensViewModelクラスは下のように、コードは削除された.
    public class TokensViewModel extends ViewModel {
        private final MutableLiveData defaultWallet;
        private final MutableLiveData defaultNetwork;
    
        private final MutableLiveData tokens;
        private final MutableLiveData prices;
    }
    
    MutableLiveDataは前述したLiveDataのサブクラスであり,UIインタフェースでデータを購読することができ,各データを逐一分解する.

    現在のアカウントを表示


    次の2つのステップに分けられます.
  • データベースからアカウントを読み出す.
  • 画面表示アカウント
  • TokensViewModelではMutableLiveData defaultWalletが定義されており、データベースからアカウントを読み込むとdefaultWalletに保存され、UIでdefaultWalletが観察表示されます.
    注記:登鎖財布に大量に使われているこの方式は、LiveDataを介してデータブリッジを行います.
    前回のインポートアカウントとアカウント管理では、すべてのアカウントがgreenDaoで保存されているので、すべてのアカウントをロードして、現在選択されているものを選択する必要があります.コードを組み合わせて見てみましょう.
    // WalletDaoUtils.java
        public static ETHWallet getCurrent() {
            List ethWallets = ethWalletDao.loadAll();
            for (ETHWallet ethwallet : ethWallets) {
                if (ethwallet.isCurrent()) {
                    ethwallet.setCurrent(true);
                    return ethwallet;
                }
            }
            return null;
        }

    上のコードはまずETHWalletDao.loadAllですべてのアカウントをロードし、現在選択されているものを返します.上のコードはFetchWalletInteractクラスのfindDefaultメソッドに呼び出されます.ViewModleでは、データでインタラクティブなクラスが多いので、xxxInteractと名付けられます.これも習慣的な使い方です.
    コードは次のとおりです.
       // FetchWalletInteract.java
       //         Single   
       public Single findDefault() {
            return Single.fromCallable(() -> {
                return WalletDaoUtils.getCurrent();
            }).subscribe(this::onDefaultWallet);
        } 
    
        //               defaultWallet   LiveData
        private void onDefaultWallet(ETHWallet wallet) {
            defaultWallet.setValue(wallet);
        }
    findDefault()は、後述のドキュメントを参照することができない場合、購読可能なSingleオブジェクトを返します.
    その後、UIインタフェース PropertyFragment.javaにおいて、defaultWalletを購読することができる.
    tokensViewModel.defaultWallet().observe(this,  this::showWallet);

    デフォルトのアカウントを取得すると、showWalletにコールバックされます.
    // UI   
        public void showWallet(ETHWallet wallet) {
            tvWalletName.setText(wallet.getName());
            tvWalletAddress.setText(wallet.getAddress());
    
        }

    これでインタフェースの表示が完了し、次編では引き続き残高取得について説明します.

    リファレンスドキュメント

  • lifecycle公式ドキュメントアドレス
  • RxAndroid詳細応答プログラミング
  • 財布の開発を専門に議論する微信群を作成し、微信:xlbxiong注釈:財布を追加しました.
    知識星に参加し、優秀なブロックチェーン業者と一緒に勉強します.ブロックチェーンを深く浅くする-システム学習ブロックチェーン、学区ブロックチェーンはすべてここにあり、最高のブロックチェーン技術ブログを作ります.
    本文のテキストリンク