1. 程式人生 > >如何開發一款以太坊安卓錢包系列3

如何開發一款以太坊安卓錢包系列3

開發十年,就只剩下這套架構體系了! >>>   

這是如何開發以太坊(安卓)錢包系列第3篇, 錢包賬號資產資訊展示,展示資訊主要包括賬號地址、eth餘額及該賬號所擁有的Token及餘額。

預備知識 MVVM

本文會涉及和UI介面的互動,提前理解下介面和資料如何互動是非常有必要的,如果你已經很熟悉MVVM,可跳過這一小節。

最早寫Android的時候,資料和介面經常耦合在一起,一個Activity檔案總是特別大,每當產品介面改版就非常痛苦,吐槽下,很多產品經理都喜歡對介面改來改去。

後來Google 推薦多個架構模式: MPV、 MVVM模式來解決資料和UI耦合的問題,登鏈錢包程式碼,使用的就是MVVM模式,所以對它做一個簡單介紹,下面是MVVM的檢視和資料的互動圖:

View 通常對應於Activity/Fragment/自定義View Model:則是和資料相關的模組。

View 與 Model 不直接發生聯絡, 而是通過ViewModel負責接收View層的事件以及獲取並處理資料,ViewModel層的資料變化也會通知給View層進行相應的UI的更新,從而實現業務邏輯和Ui的隔離。

使用MVVM模式最大的優點就是解耦, 因為資料處理邏輯是獨立於View, 在UI更改時,ViewModel 不用做太多改動。

我們使用了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個部分:

  1. 顯示當前選中的賬號
  2. 顯示當前賬號 ETH 餘額
  3. 顯示當前賬號下 Token 數量
  4. 顯示對應的法幣金額。

為了避免 UI 與上面4個數據的耦合,程式碼使用了一個TokensViewModel, 獲取到的資料用 LiveData做了一個Wrap,以便UI可以訂閱資料,TokensViewModel類像下面,程式碼有刪減:

public class TokensViewModel extends ViewModel {
    private final MutableLiveData<ETHWallet> defaultWallet;
    private final MutableLiveData<NetworkInfo> defaultNetwork;

    private final MutableLiveData<Token[]> tokens;
    private final MutableLiveData<Ticker> prices;
}

MutableLiveData 是前面提到的 LiveData的子類,在UI介面中就可以對資料進行訂閱,下面我們逐一拆解下每個資料。

顯示當前賬號

可以分為兩個步驟:

  1. 從資料庫中讀取賬號;
  2. 介面顯示賬號

TokensViewModel中定義了一個MutableLiveData<ETHWallet> defaultWallet ,從資料庫中讀取賬號會儲存在defaultWallet中,然後UI對 defaultWallet 進行觀察顯示。

註解: 登鏈錢包 裡大量使用的這個方式,通過一個LiveData 做資料橋接。

在上一篇匯入賬號及賬號管理,所有的賬號使用greenDao 儲存起來, 因此我們只需要把所有賬號從加載出來,挑選出當前選中的那一個。 結合程式碼看一看:

// WalletDaoUtils.java
    public static ETHWallet getCurrent() {
        List<ETHWallet> 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<ETHWallet> 物件
   public Single<ETHWallet> findDefault() {
        return Single.fromCallable(() -> {
            return WalletDaoUtils.getCurrent();
        }).subscribe(this::onDefaultWallet);
    } 

    // 獲取到預設錢包賬號 設定到 defaultWallet 這個LiveData
    private void onDefaultWallet(ETHWallet wallet) {
        defaultWallet.setValue(wallet);
    }

findDefault()返回一個可訂閱的Single<ETHWallet> 物件,如果不熟悉可參考後面的文件。

之後,在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());

    }

這樣, 介面的顯示就完成了,下一篇繼續介紹獲取餘額。

參考文件

  1. lifecycle官方文件地址
  2. RxAndroid 瞭解更多響應式程式設計

我建立了一個專門討論錢包開發的微信群,加微信:xlbxiong 備註:錢包。

加入知識星球,和一群優秀的區塊鏈從業者一起學習。 深入淺出區塊鏈 - 系統學習區塊鏈,學區塊鏈的都在這裡,打造最好的區塊鏈技術部落格。

本文

相關推薦

如何開發錢包系列3

開發十年,就只剩下這套架構體系了! >>>   

如何開發錢包系列3 - 資產信息展示

block final 對數 數量 改版 greendao 自定義 static 讀取 這是如何開發以太坊(安卓)錢包系列第3篇, 錢包賬號資產信息展示,展示信息主要包括賬號地址、eth余額及該賬號所擁有的Token及余額。 預備知識 MVVM 本文會涉及和UI界面的交互,

如何開發錢包系列1 - 通過助記詞創建賬號

aging generate hub trac more roo new cti 生成 上周我開源了一款錢包,反映很好,一周時間不到已經快到100 Star。接下來我會幾篇系列文章把開發以太坊錢包的核心要點寫出來,也算是對代碼的一個解讀。 寫在前面 錢包是使用Androi

如何開發錢包系列1

開發十年,就只剩下這套架構體系了! >>>   

如何開發錢包系列2

開發十年,就只剩下這套架構體系了! >>>   

無意中發現挖礦破解抽水神器-ETH超級礦工-NoDevFee,反抽水加收益2%-5%。

Claymore 挖礦核心作為全球最強的ETH/ETC的挖礦軟體,自然會受到全球礦工的關注和使用。但在使用Claymore 挖礦核心時,會被作者抽取1%-2%的收益。當然你也可以使用"-NoFee"引數,作者不會抽取費用。但是你的算力會降低5%。 關於這個抽水,作者也是良心

發現挖礦神器免抽水長沙礦工,聖騎士,支援ETH,ETC+SC等各種雙挖(11.9核心)破解抽水

完全遮蔽抽成,經分析核心採用Claymore's核心的軟體,經測試: 優點: 1,相容WINDOWS7,10作業系統,圖形化操作介面,人性化設定; 2,內建本地算力曲線圖,能夠掌握任何時候礦機的算力狀態; 3,具有開機自動啟動,自動挖礦; 4,採用Claymore'

區塊鏈開發(十賬戶管理

賬戶 賬戶在以太坊中發揮著中心作用。共有兩種賬戶型別:外部賬戶(EOAs)和合約賬戶。我們這裡重點講一下外部賬戶,以下會簡稱為賬戶。合約賬戶簡稱為合約, 在合約章節具體討論。把外部賬戶和合約賬戶都歸入到帳戶的一般概念是合理的,因為這些實體都是所謂的狀態物件。這些實體都有狀態

科普貼 | 代幣錢包MyEtherWallet使用教程,步步教你玩轉MEW

按鈕 wid isp 查詢 到你 pan fail VC oam MyEtherWallet 是一個以太坊的網頁錢包,使用非常簡單,打開網頁就可以使用,源代碼開源,不會在服務器上存儲用戶的錢包信息如私鑰和密碼。支持 Ledger Wallet、TREZOR 等硬件錢包

Via瀏覽器 v3.4.5 又經典簡潔的瀏覽器

Via瀏覽器是由國內開發者開發的一款安卓平臺上的極簡瀏覽器,它追求極簡,是極客之選。Via瀏覽器以極客思維為主線,化繁為簡,簡化過程,提升搜尋與瀏覽的效率,注重瀏覽體驗,乾淨利落,簡約不簡單。 小體積的瀏覽器讓每個安卓機型都可以輕鬆駕馭。麻雀雖小五臟俱全,Via瀏覽器常用功能一應俱全,對於高階的

開發】如何開發一個編譯智能合約並且發布的平臺(二)

vid new 有一個 tran slim ole https parse 交易 接上一章的內容,這篇介紹 deploy相關和結果演示。 deploy一個合約的過程中,需要計算發布的消耗和nonce值。 當進行每筆交易時,發送人設定Gas Limit 和Gas Pric

p2p網路():p2p網路部分結構

一、以太坊p2p模組組成 在以太坊p2p目錄下,主要包括以下幾個模組: p2p模組 功能 discover 包含了Kademlia協議。是基於UDP的p2p節點發現協議。 discv

給 Web 開發人員的入坑指南

以太坊現在各種學習資料數不勝數,但由於以太坊正處於飛速發展階段,有些學習資料很快就過時了。所以想找到有價值的資料無異於大海撈針。我費了很大功夫,才建立起對以太坊的整體認識,搞清楚它的工作機制。我相信很多躍躍欲試的開發人員正面臨著跟我一樣的問題,所以我把自己的認識整理出來,希望能對大家有

區塊鏈實踐(網路+geth搭建私有網路實戰

一、乙太網網路 理解以太坊 PrivateNetwork 先要理解以太坊的兩種官方網路, 目前以太坊官方提供了兩種網 生產環境網路 測試網路 TestNet ** 1 以太坊生產網路 以太坊的生產網路顧名思義,也就是產生真正有價值的 的以太幣的網路

PHP開發區塊鏈支付系統

當我第一次考慮通過加密貨幣實施支付時,我查看了像Stripe這樣的可用解決方案。我覺得Stripe的問題在於,它只允許使用美國商家帳戶進行比特幣支付,所以這對我來說不是一個選擇。在以太坊世界,它看起來更糟糕。有一些較新的服務,但他們都想要分享蛋糕。 那麼從頭開始構建以太坊支

失落的:埋頭苦研3年不如EOS主網上線3

最近EOS的熱度居高不下,完全佔據了公鏈C位,據14號sludgefeed報道,EOS的每日Dapp使用者和交易量超過以太坊,EOS在24小時內共11,428名使用者,而以太坊則為10,562名。此外,EOS7天的Dapp交易量為4800萬美元,而以太坊僅有2600萬美元

原始碼深入分析(3)-- RPC通訊例項和原理程式碼分析(上)

上一節提到,以太坊在node start的時候啟動了RPC服務,以太坊通過Rpc服務來實現以太坊相關介面的遠端呼叫。這節我們用個例項來看看以太坊 RPC是如何工作的,以及以太坊RPC的原始碼的實現一,RPC通訊例項1,RPC啟動命令 :geth --rpcgo-ethereu

ETH與代幣錢包MyEtherWallet使用教程

作者:黎躍春,資深講師,全棧工程師;專注於「區塊鏈+內容」產品的開發以及區塊鏈技術培訓。 公眾號:區塊鏈部落 QQ群:348924182 區塊鏈技術部落閣:http://liyu

【親測】Ethereum Wallet錢包geth從C盤成功轉移到其他盤

可憐的C盤,隨著以太坊Ethereum Wallet錢包不斷增大,終於容不下了,尋找方法轉移一開始使用的是datadir,竟然沒用,然後8位元去尋找方法,終於看到一個帖子說 mklink /J 有用,但是沒嘗試過,好吧,我來做小白鼠原文地址:http://8btc.com/t

EthBox開發套件,鍵安裝開發環境

百度雲 技術 aid 驗證 cli nac 下載到本地 ejs 11.2 EthBox是匯智網為了方便以太坊開發學習者快速安裝本地開發環境而 制作的開發套件,可以一鍵安裝以下必備開發工具: nodejs:8.11.2 git:2.17.1.2 geth:1.8.10 ga