在 Android 中实现 Signal R

2024-05-01

我尝试过以下方式,

import java.util.concurrent.ExecutionException;

import microsoft.aspnet.signalr.client.LogLevel;
import microsoft.aspnet.signalr.client.Logger;
import microsoft.aspnet.signalr.client.Platform;
import microsoft.aspnet.signalr.client.SignalRFuture;
import microsoft.aspnet.signalr.client.http.android.AndroidPlatformComponent;
import microsoft.aspnet.signalr.client.hubs.HubConnection;
import microsoft.aspnet.signalr.client.hubs.HubProxy;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Base64;

public class HomeActivity2 extends Activity {
    /**
     * shared preference for access temp storage
     */
    private SharedPreferences settings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        settings = getSharedPreferences(Utils.PREFS_NAME, 0);
        Platform.loadPlatformComponent(new AndroidPlatformComponent());
        String host = "MyURL";
        String CONNECTION_QUERYSTRING = "ClientID="
                + settings.getString("clientID", "") + "&RoleID="
                + settings.getString("roleID", "") + "&UserID="
                + settings.getString("employeeID", "");
        HubConnection connection = new HubConnection(host,
                Base64.encodeToString(CONNECTION_QUERYSTRING.getBytes(),
                        Base64.URL_SAFE | Base64.NO_WRAP), false, new Logger() {

                    @Override
                    public void log(String message, LogLevel level) {
                        // TODO Auto-generated method stub
                        System.out.println(message);
                    }
                });
        HubProxy hub = connection.createHubProxy("NotificationHub");
        SignalRFuture<Void> awaitConnection = connection.start();
        try {
            awaitConnection.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这是我的 Logcat 跟踪

HubConnection - Creating hub proxy: notificationhub
HubConnection - Entered startLock in start
HubConnection - Start the connection, using AutomaticTransport transport
HubConnection - Start negotiation
AutomaticTransport - Start the negotiation with the server
HubConnection - Getting connection data: [{"name":"notificationhub"}]
HubConnection - Getting connection data: [{"name":"notificationhub"}]
AutomaticTransport - Execute the request
Create new thread for HTTP Connection
Execute the HTTP Request
URL: http://citrusz.com/notification/signalr/negotiate?clientProtocol=1.3&connectionData=%5B%7B%22name%22%3A%22notificationhub%22%7D%5D&Q2xpZW50SUQ9Q0xOVEFBQUEwMDAxJlJvbGVJRD1ST0xFQUFBQTAwMDEmVXNlcklEPUVNUEFBQUEwMDAz
VERB: GET
Header User-Agent: SignalR (lang=Java; os=android; version=2.0)
CONTENT: null
Request executed
AutomaticTransport - Response received
AutomaticTransport - Read response data to the end AutomaticTransport - Trigger onSuccess with negotiation data: {"Url":"/notification/signalr","ConnectionToken":"SYqo8IyKwjb1zqPzDkPuVsMSrqgDmaQASB0Jirr1yUXRW698WbS8cM0BYuHdFQIEtQf5IYenCNp+1KV2EwUF7QOAcyaLbI4ohLiGKvf2umGn6+dbitwZcKLwjSCgJfpo","ConnectionId":"41c2e849-756f-4cb9-90fc-2688fdbbb619","KeepAliveTimeout":20.0,"DisconnectTimeout":30.0,"TryWebSockets":false,"ProtocolVersion":"1.3","TransportConnectTimeout":5.0}
HubConnection - Negotiation completed
HubConnection - ConnectionId: 41c2e849-756f-4cb9-90fc-2688fdbbb619
HubConnection - ConnectionToken: SYqo8IyKwjb1zqPzDkPuVsMSrqgDmaQASB0Jirr1yUXRW698WbS8cM0BYuHdFQIEtQf5IYenCNp+1KV2EwUF7QOAcyaLbI4ohLiGKvf2umGn6+dbitwZcKLwjSCgJfpo
HubConnection - Keep alive timeout: 20.0
HubConnection - Entered startLock in startTransport
HubConnection - Starting the transport
GC_CONCURRENT freed 620K, 12% free 6348K/7175K, paused 3ms+3ms
HubConnection - Starting transport for InitialConnection
serverSentEvents - Start the communication with the server
HubConnection - Getting connection data: [{"name":"notificationhub"}]
serverSentEvents - Execute the request
Create new thread for HTTP Connection
Execute the HTTP Request
URL: http://citrusz.com/notification/signalr/connect?transport=serverSentEvents&connectionToken=SYqo8IyKwjb1zqPzDkPuVsMSrqgDmaQASB0Jirr1yUXRW698WbS8cM0BYuHdFQIEtQf5IYenCNp%2B1KV2EwUF7QOAcyaLbI4ohLiGKvf2umGn6%2BdbitwZcKLwjSCgJfpo&connectionId=41c2e849-756f-4cb9-90fc-2688fdbbb619&connectionData=%5B%7B%22name%22%3A%22notificationhub%22%7D%5D&Q2xpZW50SUQ9Q0xOVEFBQUEwMDAxJlJvbGVJRD1ST0xFQUFBQTAwMDEmVXNlcklEPUVNUEFBQUEwMDAz
VERB: GET
Header Accept: text/event-stream
Header User-Agent: SignalR (lang=Java; os=android; version=2.0)
CONTENT: null
Request executed
threadid=3: reacting to signal 3
Wrote stack traces to '/data/anr/traces.txt'

我认为 SignalR 已连接,但我的 Android 屏幕是全黑的,如果我评论awaitConnection.get();应用程序运行良好,我不知道我做错了什么。任何帮助将非常感激

谢谢,古纳


当您通过调用“get()”使连接同步时,它会挂起。

我遇到了类似的问题,就我而言,这是 WebSockets 的问题,不得不转而使用 ServerSentEvents。

HubProxy hub = connection.createHubProxy("NotificationHub")
ClientTransport transport = new ServerSentEventsTransport(connection.getLogger());

SignalRFuture<Void> awaitConnection = connection.start(transport);
try {
    awaitConnection.get();
}
catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 中实现 Signal R 的相关文章

  • 文件递归搜索

    我试图在根目录及其子目录中查找文件 步骤1 在指定路径中查找目录 步骤2 如果找到上述目录 则在其子目录之一中查找文件 为此 我使用下面的代码片段进行递归搜索 现在 这里的问题是 当它满足我的上述要求时 如何突破递归 boolean bFi
  • 删除 Android 中切换按钮的填充

    我正在 android 中创建一个简单的切换按钮并将背景设置为可绘制对象
  • Android Wear:在手持设备上启动服务

    我正在构建一个 Wear 应用程序 它将与手持设备上的 WearableListenerService 进行通信 但是 我想确保当应用程序在手表上启动时服务已启动并运行 我最初的想法是发送意图或广播消息来启动服务 但是 我一直无法弄清楚如何
  • AdMob 广告未显示

    因此 我使用 Play Services SDK 实施了 AdMob 广告 我已经 按照书本 做了所有事情 但广告不会显示 如果我将 AdView 背景设置为白色 它会显示空白 但不显示广告 我正在使用 Fragments 但我将 AdVi
  • 在styles.xml中设置所有按钮样式

    我想让我的应用程序有多种样式 样式更改按钮样式 文本视图颜色和布局背景颜色 我的按钮样式位于 xml 文件中 这是我的代码 style xml v21
  • Android Surface 与 Canvas 的关系

    Surface 和 Canvas 之间到底是什么关系 请解释 表面是一个缓冲区 画布保存绘图 视图未附加到画布 也不是表面 窗户被绑在 Surface 和 ViewRoot 询问 随后使用的画布表面 通过要绘制的视图 详细答案你可以阅读这篇
  • 如何在状态更改时更改 Android 切换按钮的文本颜色?

    我的切换按钮对于每个状态都有不同的颜色背景 红色和白色 现在我需要在激活时更改切换按钮文本 红色 白色 的颜色 使用 xml 我无法让它工作 也许有人知道我做错了什么 我的布局 xml 中的按钮
  • 如何在Android中将文件转换为base64(如.pdf、.text)?

    如何将 SD 卡文档 pdf txt 转换为 Base 64 字符串并将字符串发送到服务器 这个方法对我有用 String encodeFileToBase64Binary encodeFileToBase64Binary yourFile
  • InflateException 膨胀类 android.support.design.widget.CoordinatorLayout 时出错

    E AndroidRuntime 致命异常 main 进程 com atech a business PID 30662 java lang RuntimeException 无法启动活动 ComponentInfo com atech a
  • 无法从视图转换为按钮

    我在这里遇到非常令人沮丧的问题 我有这个代码 Button b findViewById android R id button1 我收到了这个错误 类型不匹配 无法将表单视图转换为按钮 但是按钮1is一个按钮 在我的 XML 布局文档中
  • 如何在android中播放内部和外部SD卡中的mp3文件?

    我正在开发一个 mp3 播放器应用程序 它可以播放内部 SD 卡内任何位置的 mp3 文件 我使用以下代码来获取内部存储中存在的 mp3 文件 ArrayList
  • Android中从一个应用程序向另一个应用程序发送数据时的加密

    我想将敏感数据从一个应用程序发送到另一个应用程序 我使用 Intent 并通过 Bundle 发送数据 现在 我应该使用加密算法来加密要发送的数据 同时接收器应用程序将解密数据 哪种算法最适合移动平台 我浏览过RSA文档 建议不建议用于长文
  • 喷气背包中不同类型的宽度组成

    我正在 jetpack compose 的文本字段中工作 我想建立这样的东西 TextField value value onValueChange value it modifier Modifier requiredWidth 56 d
  • 如果从超链接打开,应用程序将启动两次

    我正在开发一个应用程序 可以从多个地方启动 例如日历中的超链接 我在以下场景中面临问题 如果应用程序已启动并在后台运行 并且用户单击本机日历中的事件 超链接来启动应用程序 我的应用程序作为新实例启动两次 在正在运行的应用程序列表中 我可以看
  • 过滤列表视图并获取正确的 onclick 项目

    我有一个列表视图 并且已经实现了过滤 假设我有项目 A B 和 C 如果我在过滤框中输入 B 则只会显示项目 B 它是列表的位置 0 之前位于位置 1 因此 当我调用 onClick 项目时 我得到 id position 0 这导致显示有
  • Android图层列表不显示比例可绘制项目?

    使用下面的图层列表 我的比例绘制从未显示 这是为什么 菜单 对话框 标题 xml
  • DOM 中不再存在缓存元素

    就像在类似的问题中一样 我使用appium java 尝试选择元素 在移动应用程序中 我要转到页面 之后有许多元素 android widget ImageView 0 我需要选择 6 个 例如 这样的元素并执行其他步骤 Byt 只能选择一
  • startDrag 方法 已弃用且无法编译程序

    startDrag android content ClipData android view View DragShadowBuilder java lang Object int 已弃用 如何解决这个问题而又不失去对旧版本的兼容性 还有
  • 我收到“循环依赖”Android Dagger Hilt 错误

    我从头开始检查了所有内容 但找不到错误 我找不到错误 可能是什么 我收到以下编译错误 HomeViewModel java 6 error ComponentProcessor MiscError dagger internal codeg
  • 在 Android 上提取/修改视频帧

    我有一个视频文件 我想获取视频的每一帧并对帧进行一些修改 例如在其中绘制另一个位图 放置一些文本等 Android 中是否有任何 API 框架可用于从视频中获取帧 我在 iOS 中使用他们的 AVFramework 做了类似的事情 如果可以

随机推荐

  • 用户已拥有超过“max_user_connections”个活动连接 HANGFIRE

    我明白 用户已拥有超过 max user connections 个活动连接 已经有很多答案了 但这是关于Hangfire的 我在用Hangfire http docs hangfire io en latest background pr
  • 量角器元素(..)从单独的文件返回未定义

    我正在编写一个 Protractor 测试 在我的 test step js 文件中我有 element by css getText then function text expect text to equal expectedText
  • 如何在 Lua 中实现 OO?

    Lua 没有内置对 OO 的支持 但它允许您自己构建它 您能否分享一些实现面向对象的方法 请为每个答案写一个例子 如果您有更多示例 请发布另一个答案 我喜欢将 OOP 视为容器 对象 内的数据封装以及可以使用该数据完成的操作子集 还有很多内
  • Gstreamer、rtspsrc 和负载类型

    我在从特定摄像头检索 rtsp 流时遇到困难 因为摄像头提供的 rtp 有效负载类型是 35 未分配 并且该摄像头接受的有效负载类型rtph264德佩插件的范围是 96 127 结果是 gstreamer 显示如下错误
  • IAM 允许用户访问某个区域上 ec2 的所有内容

    我试图允许一个用户对 us west 2 执行所有操作 这是我的政策 Version 2012 10 17 Statement Effect Allow Action ec2 Resource arn aws ec2 us west 2 8
  • 在谷歌应用程序引擎中使用低级 API 进行数据存储?是不是很糟糕?

    关于如何使用数据存储的低级 api 的文档很少 而关于 JPA 和 JDO 以及如何转换为 JPA 和 JDO 的文档却很多 我的问题是 根据 JPA 或 JDO 规范进行编码而不是直接访问数据存储的低级 api 有什么优势吗 乍一看 这似
  • 拒绝访问 .htaccess 中的 .ini 文件是否安全?

    我的 php Web 应用程序中有一个包含敏感信息的 ini 文件 我使用 htaccess 文件拒绝访问它
  • 将 NSTextAttachment 图像置于单行 UILabel 旁边

    我想附加一个NSTextAttachment图像到我的属性字符串并使其垂直居中 我使用以下代码来创建我的字符串 NSMutableAttributedString str NSMutableAttributedString alloc in
  • OAuth:从 Google App Engine 中启动 Google 计算实例

    我有一个 Google App Engine 网络应用程序 它运行着我网站的大部分内容 然而 对于某些功能 我需要一台linux机器 我希望我的 Google App Engine 应用程序能够在某些事件上自动启动 Google 计算实例
  • 如何在android系统状态栏中显示文本

    我正在尝试为 Android Nougat 开发一个应用程序 我想在从 android 服务例程生成的状态栏中显示一些信息 文本 所以我的问题是 我不知道如何在状态栏中显示文本 我添加了一个示例图像来显示我的确切含义 红色圆圈 我知道这是可
  • 路由器基本名称无法匹配 URL,因为它不是以基本名称开头

    升级到 React Router v6 后 我的应用程序停止工作 并且我未能找到在版本 6 中实现相同行为的方法 这是我升级到的版本 react router dom 6 2 1 这是与先前版本一起使用的代码5 2 0
  • JAVA FXCollections LoadException 类不是有效类型

    我正在尝试在此帮助下实现带有一些数据的 TableViewTutorial https docs oracle com javafx 2 fxml get started fxml tutorial intermediate htm CIA
  • 在 github 推送上将静态站点部署到 s3 的最佳策略? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想自动将我们的网站部署到 AWS S3 我已经编写了一个节点脚本来自动构建和上传网站 但我希望每当m
  • 有谁知道这是怎么做到的? SQL注入

    由于许多其他网站已被攻击 我不得不假设它是一个机器人 它注入了一个脚本 昨天 http google stats50 info ur php Today http google stats49 info ur php 它将它注入到多个表中
  • 阈值绝对值

    我有以下功能 char f1 int a unsigned b return abs a lt b 为了执行速度 我想重写如下 char f2 int a unsigned b return unsigned a b lt 2 b redu
  • 如何用C语言查找桌面路径?

    谁能告诉我如何使用 C 语言命令获取桌面路径 环境变量 场景是我想在桌面上保存一个文件 我所能做的就是给出一个固定的桌面路径和一个文件名来保存文件 但是在给出这个固定路径之后 我的代码将变得僵化 并且无法在具有不同桌面路径 环境变量 的任何
  • “ef migrations add”始终在新迁移中重新创建外键

    我安装了 RC1 和 VS 2015 update 1 每当我尝试添加新的迁移时 都会在 Up 方法中重新创建同一组外键 这意味着它们被删除然后直接添加 例如 当我添加迁移而不更改任何模型时 会生成该迁移 当然 Down 方法中也会生成类似
  • 没有确认提示的自定义 URL 方案 (Swift)

    我发现有两个选项可以从 Safari 网页打开我的应用程序 在我的应用程序项目中创建的自定义 URL 方案Info plist或苹果的通用链接 显然 自定义 URL 方案是最容易设置的方案 但我遇到的问题是 Safari 会显示一个确认窗口
  • 客户端使用高端口号

    为什么客户端会结束连接 使用高端口号 临时端口 而应用程序 监听通常较小的端口号 谢谢你的优点 卡蒂克 巴拉古鲁 服务器侦听固定端口号 以便客户端知道连接到哪里 客户端不需要使用固定端口号 因为没有人发起与它们的连接 事实上 如果同一台计算
  • 在 Android 中实现 Signal R

    我尝试过以下方式 import java util concurrent ExecutionException import microsoft aspnet signalr client LogLevel import microsoft