小编Mos*_*atz的帖子

使用Kotlin Coroutines代替LocalBroadcastManager进行Firebase消息传递

在Android上使用Firebase Cloud Messaging时,通常希望将Activity传入的推送通知通知当前。推荐的一种方法是使用LocalBroadcastManager来将实现IntentFirebaseMessagingService实现发送到ActivityStackOverflow示例答案)。

但是,从1.1.0-alpha01(2018-12-17)版本开始,LocalBroadcastManager不推荐使用

LocalBroadcastManager是应用程序范围的事件总线,在您的应用程序中包含违反层的行为:任何组件都可以侦听其他任何事件。您可以LocalBroadcastManager用其他可观察模式的实现方式代替的用法,具体取决于您的用例,这些选项可能是LiveData或响应流。

尽管此类很可能会保留更长的时间,但我还是想开始清理我们的应用程序,因此我想迁移到更好的方法,然后Google真正删除旧方法。

目前,这些本地广播在我们的应用程序中具有两个主要角色:

  1. 使用来自推送通知的新数据更新UI。这种工作方式是,每个Activity关心传入推送数据的人都有一个广播接收器,该接收器侦听适当的消息并更新其自己的视图数据。
  2. 如果服务器发送结束会话的通知,则强制用户注销。这适用于每个活动都有广播接收器实例的实例,该实例侦听注销事件,结束该活动,然后启动“登录”活动。

如我所见,这些用例在两个建议的替代方案上都有问题:

  • LiveData最容易用于ActivityFragment作为的一部分ViewModel。但是,ViewModel只能用于直接处理UI的那些类。从架构ViewModel内部访问FirebaseMessagingService会带来丑陋的结果,从架构的角度来看,这确实是一个坏主意。另外,不同的活动和片段具有不同的ViewModel对象,我不希望该服务需要访问它们全部。
  • 我可以创建object具有一系列LiveData属性的Kotlin (又称Singleton),从传入消息中FirebaseMessagingService更新这些LiveData对象,并Activity观察这些更改并将其复制到其自己ViewModelLiveData属性中。问题是双重的:首先,它要求我LiveData为每个数据块拥有两个相同的对象,一个在中ViewModel,一个在中object;第二,它对处理“注销事件”没有帮助,因为LiveData它是用来处理变化的数据,而不是侦听事件流。(我也许可以使用“ LiveData事件包装器”处理第二个问题,但是对于那些本来无法正常工作的东西来说,这仍然感觉很糟糕。)
  • 尽管响应流(例如RxJava)可能会满足我的需要,但我已经迫使我的团队在过去的几个月中学习Kotlin,Android Databinding,Android ViewModel以及许多其他新东西,但我认为它们并不可能需要更多。RxJava只是为此用途而增加的一件大事,并且我们没有计划重写整个应用程序以利用它来证明其增加的合理性。

我发现的一个建议是将Kotlin …

android kotlin firebase kotlin-coroutines

8
推荐指数
1
解决办法
211
查看次数

使用单一服务在Linux上测试Windows DOTNET服务

我正在尝试使用单一服务在Linux上运行Windows .NET-4.0服务.它不是用单声道或任何东西编译的.我不是100%它可行,但我想我可以尝试(二进制兼容等,似乎可行吗?).如我错了请纠正我.

我收到错误,它找不到一些dll.他们在系统中,但它没有找到它们.这是一个.

$ ldconfig -p | grep Posix
    libMonoPosixHelper.so (libc6,x86-64) => /usr/lib/libMonoPosixHelper.so
Run Code Online (Sandbox Code Playgroud)

我尝试添加路径等但没有变化.

$ MONO_LOG_LEVEL=debug mono-service MyService.exe --debug > output.log
Run Code Online (Sandbox Code Playgroud)

要么

$ MONO_PATH=/usr/lib MONO_LOG_LEVEL=debug mono-service MyService.exe --debug > output.log
Run Code Online (Sandbox Code Playgroud)

或LD_LIBRARY_PATH,这是空的,所以我试过

export LD_LIBRARY_PATH=/usr/lib
Run Code Online (Sandbox Code Playgroud)

在输出中总是这样:

Mono: DllImport attempting to load: 'libMonoPosixHelper.so'.
Mono: DllImport loading library: '/usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/libMonoPosixHelper.so'.
Mono: DllImport error loading library '/usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/libMonoPosixHelper.so: cannot open shared object file: No such file or directory'.
Mono: DllImport loading library: '/usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/libMonoPosixHelper.so'.
Mono: DllImport error loading library '/usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/libMonoPosixHelper.so: cannot open shared object file: No …
Run Code Online (Sandbox Code Playgroud)

c# linux mono .net-4.0 mono-service

7
推荐指数
1
解决办法
2808
查看次数

雄辩的morphOne关系不限于一种关系

我遇到了Eloquent morphOne关系的问题,即创建新条目而不是更新已存在的条目.

基本上我有一些模型(例如,让我们说PersonBuilding)都需要一个位置,所以我创建了一个Location模型:

class Location extends Eloquent {

    public function locationable()
    {
        return $this->morphTo();
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在我的其他模型中我有这个:

class Person extends Eloquent {

    // ...

    /**
     * Get the person's location
     * 
     * @return Location
     */
    public function location()
    {
        return $this->morphOne('Location', 'locationable');
    }

    // ...
Run Code Online (Sandbox Code Playgroud)
class Building extends Eloquent {

    // ...

    /**
     * Get the building's location
     * 
     * @return Location
     */
    public function location()
    {
        return $this->morphOne('Location', 'locationable');
    }

    // ... …
Run Code Online (Sandbox Code Playgroud)

polymorphism laravel eloquent laravel-4

7
推荐指数
2
解决办法
6839
查看次数

AndroidAsync websockets无法正常工作

我正在使用koush的这个AndroidSync库来创建websocket(服务器/客户端)并在两个Android设备之间传输数据.这两个设备通过wifi连接(一个是Wifi AP,另一个连接到它).在发送请求4-5秒后,我在客户端设备中收到TimeoutException.这就是我到目前为止所做的......

ServerActivity.java

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_server);

    mSockets = new ArrayList<WebSocket>();
    mAsyncHttpServer = new AsyncHttpServer();
    mWebSocketCallback = new AsyncHttpServer.WebSocketRequestCallback() {
        @Override
        public void onConnected(final WebSocket webSocket, RequestHeaders headers) {
            mSockets.add(webSocket);
            webSocket.send("Welcome Client");
            webSocket.setClosedCallback(new CompletedCallback() {
                @Override
                public void onCompleted(Exception ex) {
                    try {
                        if (ex != null)
                            Log.e("WebSocket", "Error");
                    } finally {
                        mSockets.remove(webSocket);
                    }
                }
            });
            webSocket.setStringCallback(new WebSocket.StringCallback() {
                @Override
                public void onStringAvailable(String s) {
                    Log.d("SERVERTAG",s);
                    Toast.makeText(getApplicationContext(),s,Toast.LENGTH_SHORT).show();
                }
            });
        }
    };

    mAsyncHttpServer.websocket("/",mWebSocketCallback);
    mAsyncHttpServer.listen(Utils.PORT_NUMBER); …
Run Code Online (Sandbox Code Playgroud)

java android websocket socket.io androidasync-koush

7
推荐指数
1
解决办法
5679
查看次数

下载需要身份验证的纯二进制 Swift 包

我正在使用 Xcode 13.1 中内置的 Swift 包管理器(不是使用 的命令行版本Package.swift)。

我的依赖项之一是纯二进制包。该包的外观如下Package.swift

// swift-tools-version:5.5

import PackageDescription

let package = Package(
    name: "MyLibrary",
    products: [
        .library(
            name: "MyLibrary",
            targets: ["MyLibrary"]),
    ],
    dependencies: [],
    targets: [
        .binaryTarget(
            name: "MyLibrary",
            url: "https://gitlab.example.com/api/v4/projects/85/packages/generic/mylibrary/1.0.1/MyLibrary.xcframework.zip",
            checksum: "..."
        )
    ]
)
Run Code Online (Sandbox Code Playgroud)

该二进制文件存储在 GitLab 的通用包存储库中。

我已将托管包的 Git 存储库添加到项目中的“包依赖项”中。我已经生成了一个具有 API 和存储库访问权限的个人访问令牌,并将其添加到我的.netrc文件中:

machine gitlab.example.com
login gitlab-token
password MY_TOKEN_HERE
Run Code Online (Sandbox Code Playgroud)

当我在 Xcode GUI 中运行xcodebuild -resolvePackageDependencies或使用“文件”->“包”->“解析包版本”时,Git 存储库已成功克隆,但收到以下错误消息:

failed downloading 'https://gitlab.example.com/api/v4/projects/85/packages/generic/mylibrary/1.0.1/MyLibrary.xcframework.zip' which is required by binary target 'MyLibrary': badResponseStatusCode(401)
Run Code Online (Sandbox Code Playgroud)

我尝试将相同的凭据添加到 …

xcode .netrc gitlab swift

7
推荐指数
0
解决办法
1576
查看次数

PHP AES加密PKCS5Padding

我不是PHP编码器所以我需要一点PHP AES加密帮助.

我正在编写代码,我在PHP中加密图像文件,然后在Java(Android)中解密它们.当我加密/解密PNG文件时,一切正常,但当我尝试对JPG执行相同操作时,Java解密会引发异常:

WARN/System.err(345): java.io.IOException: data not block size aligned
Run Code Online (Sandbox Code Playgroud)

基于在线搜索,似乎这是因为我没有正确填充.

我该怎么做呢?

这是加密的PHP代码:

<?php
    $secret_key   = "01234567890abcde";
    $iv           = "fedcba9876543210";
    $infile       = "5.png";
    $outfile      = "5_encrypted.png";

    $crypttext = file_get_contents($infile);
    $plaintext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret_key, $crypttext, MCRYPT_MODE_CBC, $iv);

    header('Content-Type: application/octet-stream');
    header('Content-Length: ' . strlen($plaintext));
    header('Content-Disposition: attachment; filename=' . ($outfile));

    echo $plaintext;


    //file_put_contents($outfile,$plaintext);   
    //save the file in the folder of server
Run Code Online (Sandbox Code Playgroud)

php encryption aes padding

6
推荐指数
1
解决办法
1万
查看次数

带有数据透视表的Laravel查询生成器

我有两个带有数据透视表的表

tours

id | name | country_id | featured

countries

id | name

数据透视表 country_tour

id | country_id | tour_id

我想找到一个具有游featured旅行团表集的列1和country_idcountry_tour表设置为1。

php laravel laravel-5.3

6
推荐指数
1
解决办法
3400
查看次数

如何修复 Postgres `COPY` 命令的 VSCode 语法突出显示

我有很多.sql来自 PostgreSQL 数据库的文件。

(为了完整起见,它们是使用pg_extractor生成的,作为在 git 中签入数据库骨架的一种方式。有数百个 PL/pgSQL 函数也需要作为应用程序代码的一部分进行签入。开发人员致力于在其本地数据库服务器上运行函数,然后将其函数更改签入 git。)

在这些文件中,数据使用 PostgreSQL 命令表示COPY

例如我们的骨架数据库有如下表和数据:

CREATE TABLE roles (
    id serial NOT NULL,
    name text NOT NULL,
    name_display text NOT NULL,
    order_display integer NOT NULL
);

COPY roles (id, name, name_display, order_display) FROM stdin;
1   MASTER  Master  1
2   ORGANIZATION_ADMIN  Organization Admin  2
3   REGIONAL_ADMIN  Regional Admin  3
4   BRANCH_ADMIN    Branch Admin    5
5   SECURITY_ADMIN  Security Admin  8
6   BRANCH_MANAGER  Branch Manager  6
7   BRANCH_STAFF    Branch …
Run Code Online (Sandbox Code Playgroud)

postgresql syntax-highlighting visual-studio-code

6
推荐指数
0
解决办法
1642
查看次数

Docker 容器中间歇性 DNS 查找失败

我有一个 Node.js 应用程序在使用以下(简化的)Docker Compose 配置设置的 Docker 容器中运行:

x-restart-policy: &restart_policy
  restart: unless-stopped
x-sails-app-defaults: &sails_defaults
  << : *restart_policy
  image: registry.example.com/group/webapp/snapshots
  depends_on:
    - postgres

services:

  postgres:
    << : *restart_policy
    image: postgis/postgis:11-3.1-alpine
    environment:
      POSTGRES_PASSWORD_FILE: /postgres-password
    volumes:
      - postgres:/var/lib/postgresql/data
      - /root/postgres-setup-password:/postgres-password:ro
      - ./postgres/setup.sh:/docker-entrypoint-initdb-resources/001-setup.sh:ro

  webapp:
    << : *sails_defaults
    volumes:
      - ./apps/webapp.sailsrc:/usr/src/app/.sailsrc:ro
    labels:
      - traefik.enable=true
      - traefik.http.routers.sbdev.entrypoints=https
      - traefik.http.routers.sbdev.rule=Host(`app.example.com`)
      - traefik.http.routers.sbdev.tls=true
      - traefik.http.routers.sbdev.tls.certresolver=letsencrypt
Run Code Online (Sandbox Code Playgroud)

该应用程序的 Dockerfile 如下所示:

FROM node:fermium-alpine3.12 AS builderbase

# Need git and some other tools for npm install
RUN apk add --no-cache \
    git \ …
Run Code Online (Sandbox Code Playgroud)

dns docker docker-compose

6
推荐指数
0
解决办法
1099
查看次数

为什么在调用“titlecase”之前用检查是否小写来替换“capitalize”?

使用 Kotlin 1.5 时,Android Studio 会警告该版本String.capitalize已弃用。

建议的替换是:

myString.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() })
Run Code Online (Sandbox Code Playgroud)

为什么需要检查isLowerCase

为什么我不能这样做:

myString.replaceFirstChar { it.titlecase(Locale.getDefault()) })
Run Code Online (Sandbox Code Playgroud)

string title-case kotlin

6
推荐指数
1
解决办法
6516
查看次数