小编nob*_*ial的帖子

奇怪的 AndroidViewModel LiveData 观察者行为

我说奇怪是因为我不明白有人可能会告诉我什么正在按预期工作。

我有一个带有 LiveData 成员的 AndroidViewModel,我在 MainActivity 中观察到它来切换一些代码功能。LiveData 对象在视图模型的构造函数中分配初始值。

理论上一切工作正常,除了观察者行为在安装后第一次启动应用程序和随后的应用程序启动之间发生变化。

在安装后第一次启动期间,观察者在我设置后立即被触发,而底层的 LiveData 对象没有被更改。

在应用程序的后续启动期间,观察者不会在设置后过早触发,而是仅在我更改应用程序中其他位置的值时触发,这是我期望发生的情况。

最初我认为观察者以某种方式从 LiveData 初始化中获得延迟触发,但如果这是真的,那么无论是安装后第一次运行还是后续启动,它都应该发生。

因此,为了让应用程序按预期运行,如果应用程序在安装后首次运行,我必须在观察者中使用哨兵,以防止它们在第一次触发期间运行。

有人可以解释为什么会发生这种情况,以及它是否是预期的功能(我不相信),请向我指出解释此问题的文档?

我感觉我又在黑Android了。

下面是人们总是要求的一些代码片段,从 LiveData 声明开始。

@NonNull
private final MutableLiveData<Boolean> consentRequired = new MutableLiveData<>();
Run Code Online (Sandbox Code Playgroud)

ViewModel 构造函数初始化

    setConsentRequired(false);
Run Code Online (Sandbox Code Playgroud)

ViewModel 获取器/设置器

@NonNull
public LiveData<Boolean> getConsentRequired()
{
    return consentRequired;
}
@NonNull
public void setConsentRequired(@NonNull Boolean consentRequired)
{
    this.consentRequired.setValue(consentRequired);
}
Run Code Online (Sandbox Code Playgroud)

观察者

    getViewModel().getConsentRequired().observe(this, item ->
    {
        if (sentryAllowsObserverToRun)
        {
            // Do the observer stuff here
        }
    }
Run Code Online (Sandbox Code Playgroud)

SentryAllowsObserverToRun 是我必须设置的布尔值,以表明这不是安装后首次启动应用程序的第一个触发器。

android android-livedata android-viewmodel

5
推荐指数
1
解决办法
1199
查看次数

需要帮助了解php签名验证

我正在尝试验证php中的签名,并且已经筋疲力尽地尝试了我在网上找到的每个例子.我已经绕圈子了,所以我现在可能已经错过了解决方案.

所以我有测试数据

$msg = "test data";
Run Code Online (Sandbox Code Playgroud)

使用我的密钥对中的私钥生成此签名

$signature = "avALtk00btVyV74e5UdXJ/VClVV/fsuoLZpXQjiCrkVijsmMZsYWZujN56+Aa2CEQYkomDsm9CJ/Tue7lNP0tYVZz9Y0RngpcV9VT9V3i+3rbvbBEnuJuS/5e+PR7kQGMh8rVuCtHpAJhSePMyipC3kM90EQJ0jyY3rFaHDNpSzVBpOnRYLzqbsdy45v0bN78A2J/HaIhJy87Sh4X1a+WMg9PLkqSSYZnRYOB8XVDCYfyeeekcvI4rvP51wBQcaLwu7S0xPQA8yHfJqMXCqdmBVUQZrk/X+CujdXUyJItDWA8j2N8AHmcAD5oRaJ6bX3zCQFM1QnKMi1ETLudzIqfA==";
Run Code Online (Sandbox Code Playgroud)

这是签名密钥对的公钥

$key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxv4nCiH4vXvSLsvlceCOk3yfH1EQgNqNaVGdnFxdw9IIjSVZvTVH45NCodCJ0GlHoDwQM7DMV1+QrtF91cn44xg4Ys9zr1xkaT4jWBTe3YKoTqJoLHR4UU03F6Y1jTELhjY2a2Kt0ijyvAOKM4bm3gCItfMx59ETGInz7Oubb1T4IJ8TuWmZsh+X57c6fgv0B2+eTr/5FMK2VxXV5tHkB9UNLBgnbw0IZuC6izF4OFk9hxgh96i5wCf2HhHaNoEryx7ZV2ZG9a0OQnYZ+x1zaOIw6dJkV7rip3H57ksQfoQWM0GKMBB7cWIgWsf/GlbYTVgw26MvzEzGPb9uCfx8rwIDAQAB";
Run Code Online (Sandbox Code Playgroud)

我试过用这个包装钥匙

$pubkey = "-----BEGIN RSA PUBLIC KEY-----" . $key . "-----END RSA PUBLIC KEY-----";
Run Code Online (Sandbox Code Playgroud)

并与此

$pubkey = "-----BEGIN PUBLIC KEY-----" . $key . "-----END PUBLIC KEY-----";
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用两个包装创建一个公钥ID,没有任何包装,就像这样

$pubkeyid = openssl_pkey_get_public($pubkey);
$pubkeyid = openssl_pkey_get_public($key);
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用$ key和$ pubkeyid验证签名,使用各种算法,没有,就像这样

openssl_verify($msg, base64_decode($signature), $pubkeyid);
openssl_verify($msg, base64_decode($signature), $key);
openssl_verify($msg, base64_decode($signature), $pubkeyid, "sha256withRSAEncryption");
openssl_verify($msg, base64_decode($signature), $key, "sha256withRSAEncryption");
openssl_verify($msg, base64_decode($signature), $pubkeyid, OPENSSL_ALGO_SHA256);
openssl_verify($msg, base64_decode($signature), $key, OPENSSL_ALGO_SHA256);
Run Code Online (Sandbox Code Playgroud)

我可能尝试了其他一些排列,但现在不记得了.我头疼.

无论我尝试什么,我都没有设法验证签名.我可以轻松地使用java中的公钥来验证签名.

我讨厌要求一个有效的PHP示例,因为我已经尝试了很多我已经在网上找到的并且无法让它们工作.不幸的是phpseclib对我来说不是一个选择,所以我必须使用openssl.

我哪里错了?

php openssl digital-signature

5
推荐指数
1
解决办法
122
查看次数