如何开发一款以太坊安卓钱包系列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 对象,如果不熟悉可参考后面的文档。

之后,在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 备注:钱包。

加入知识星球,和一群优秀的区块链从业者一起学习。
深入浅出区块链 - 系统学习区块链,学区块链的都在这里,打造最好的区块链技术博客。

本文原文链接

原文地址:https://www.cnblogs.com/tinyxiong/p/10657399.html

时间: 2024-08-02 14:58:15

如何开发一款以太坊安卓钱包系列3 - 资产信息展示的相关文章

如何开发一款以太坊(安卓)钱包系列1 - 通过助记词创建账号

上周我开源了一款钱包,反映很好,一周时间不到已经快到100 Star.接下来我会几篇系列文章把开发以太坊钱包的核心要点写出来,也算是对代码的一个解读. 写在前面 钱包是使用Android安卓平台编写,使用的是原生代码Java 语言编写, 是基于Java 1.8 版本,也使用了Java 1.8 中一些较新的语言特性,如 Lambda表达式等:另外还较多使用了ReactiveX/RxAndroid响应式编程用法. 在本系列文章中,重点是介绍以太坊钱包账号.交易等逻辑,有时可能会假定读者已经了解And

【以太坊开发】如何开发一个编译以太坊智能合约并且发布的平台(二)

接上一章的内容,这篇介绍 deploy相关和结果演示. deploy一个合约的过程中,需要计算发布的消耗和nonce值. 当进行每笔交易时,发送人设定Gas Limit 和Gas Price,将 Gas Limit*Gas Price ,就得到了ETH交易佣金的成本. nonce:以太坊要求一个账户的每笔交易有一个连续的计数.每个节点将根据计数顺序严格执行来自一个用户的交易. app.js中有下面两个函数: var web3 = new Web3(new Web3.providers.HttpP

Android开发以太坊钱包生成应用程序

Android应用程序以太坊钱包生成,要做的工作不少,不过如果我们一步一步来应该也比较清楚: 1.在app/build.gradle中集成以下依赖项: compile ('org.web3j:core-android:2.2.1') web3j核心是用于从服务器下载以太坊区块链数据的核心类库.它通常用于以太坊开发. 2.我们将设计一个Android UI示例,屏幕上将有文本编辑和按钮.在EditText中,将要求用户输入钱包的密码.然后在按钮的单击事件上,我们将开始发送密码的过程.以下是layo

以太坊开发完整去中心化应用 —— 区块链投票系统

第一节 课程概述 本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. ethereum logo 通过本课程的学习,你将掌握: 以太坊区块链的基本知识 开发和部署以太坊合约所需的软件环境 使用高级语言(solidity)编写以太坊合约 使用NodeJS编译.部署合约并与之交互 使用Truffle框架开发分布式应用 使用控制台或网页与合约进行交互 前序知识要求 为了顺利完成本课程,最好对以下技术已经有一些基本了解

以太坊 DApp 开发入门实战! 用Node.js和truffle框架搭建——区块链投票系统!

第一节 概述 面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教大家如何构建一个 基于以太坊的完整去中心化应用 -- 区块链投票系统. 通过学习,你将掌握: 以太坊区块链的基本知识 开发和部署以太坊合约所需的软件环境 使用高级语言(solidity)编写以太坊合约 使用NodeJS编译.部署合约并与之交互 使用Truffle框架开发分布式应用 使用控制台或网页与合约进行交互 前序知识要求 为了顺利完成,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ru

牛奶ddw如何通过以太坊钱包实现互相打赏

很多朋友不清楚如何转账ddw,但是万能的网友是无敌的先就自己摸索的一点经验总结下今天的转账经验. 1. 提取到自己的账户 这个大家都知道如何操作,使用官方的钱包 在“日日盈app”中点击"我的设备”,点击提取收益,如果顺利币会瞬间提取到你的主账户钱包中 如果失了(查看账户余额不为0则失败),稍后使用4G或者其他网络再次尝试,多次尝试后即可 2. 如何互相转账 2.1 请下载网友提供的以太坊万能钱包:http://ox0ubbr6d.bkt.clouddn.com/Ethereum-Wallet-

(转)以太坊 钱包 创建 导入 Keystore

最近闲来无事 研究了下以太坊钱包 下边分享下 准备工作 : 需要用到的加密:BIP32 BIP39 BIP44 SCRYPT 加密算法 githab地址 https://github.com/NovaCrypto/BIP32 https://github.com/NovaCrypto/BIP39 https://github.com/NovaCrypto/BIP44 https://github.com/wg/scrypt/ 官方依赖 https://github.com/web3j/web3j

什么是以太坊?什么是智能合约?

以太坊是一个分布式的计算平台.它会生成一个名为Ether的加密货币.程序员可以在以太坊区块链上写下"智能合约",这些以太坊智能合约会根据代码自动执行. 以太坊是什么? 以太坊经常与比特币相提并论,但情况却有所不同.比特币是一种加密货币和分布式支付网络,允许比特币在用户之间转移. 相关:什么是比特币?它是如何工作的? 以太坊项目有更大的目标.正如Ethereum网站所说,"以太坊是一个运行智能合约的分布式平台".这些智能合约运行在"以太坊虚拟机"上

第18讲 | 智能合约与以太坊

在前面的文章里,我们介绍了区块链的核心技术,也穿插介绍了一些项目.然而每个区块链都有自己的特色,接下来我们将针对每个项目进行详细讲解.今天我们就来讲讲智能合约和以太坊项目. 今天我们从智能合约这个概念入手,聊聊什么是以太坊项目以及它的发展历史.最后还会介绍几款钱包给你,希望通过今天文章的讲解,你也可以尝试在以太坊上编写简单的智能合约. 智能合约的概念 不同于法律意义上的合约概念,区块链领域的合约表达的是可以“自治自理”的 计算机协议,这套协议具有自我执行.自我验证的属性. 如果完全从技术角度来看