【发布时间】:2019-06-12 04:31:20
【问题描述】:
我正在尝试将位于 How to use signalr in android Service 的代码从 java 转换为 c#,并且已经取得了一些进展。我现在坚持最后一种方法。 java代码是:
private void startSignalR() {
Platform.loadPlatformComponent(new AndroidPlatformComponent());
mInstance.setmHubConnection();
mInstance.setHubProxy();
ClientTransport clientTransport = new ServerSentEventsTransport(mInstance.mHubConnection.getLogger());
SignalRFuture<Void> signalRFuture = mInstance.mHubConnection.start(clientTransport);
try {
signalRFuture.get();
} catch (InterruptedException | ExecutionException e) {
Log.e("SimpleSignalR", e.toString());
return;
}
mInstance.sendMessage(MainActivity.unm,"Hello All!");
String CLIENT_METHOD_BROADAST_MESSAGE = "recievedMessage";
mInstance.mHubProxy.on(CLIENT_METHOD_BROADAST_MESSAGE,
new SubscriptionHandler2<String,LoginInfo>() {
@Override
public void run(final String msg,final LoginInfo loginInfo) {
final String finalMsg = loginInfo.FullName + " says " + loginInfo.Password;
Intent intent = new Intent();
intent.setAction(MY_ACTION);
intent.putExtra("DATAPASSED", finalMsg);
sendBroadcast(intent);
}
}
, String.class,LoginInfo.class);
}
使用 java 到 c# 转换器,转换为:
private void startSignalR()
{
Platform.loadPlatformComponent(new AndroidPlatformComponent());
mInstance.setmHubConnection();
mInstance.setHubProxy();
ClientTransport clientTransport = new ServerSentEventsTransport(mInstance.mHubConnection.Logger);
SignalRFuture<Void> signalRFuture = mInstance.mHubConnection.Start(clientTransport);
try
{
signalRFuture.get();
}
catch (Exception e) when (e is InterruptedException || e is ExecutionException)
{
// Log.e("SimpleSignalR", e.ToString());
return;
}
mInstance.sendMessage("", "Hello All!");
string CLIENT_METHOD_BROADAST_MESSAGE = "recievedMessage";
//String CLIENT_METHOD_BROADAST_MESSAGE = "messageReceived";
mInstance.mHubProxy.on(CLIENT_METHOD_BROADAST_MESSAGE, new SubscriptionHandler2AnonymousInnerClass(this)
, typeof(string), typeof(LoginInfo));
}
private class SubscriptionHandler2AnonymousInnerClass : SubscriptionHandler2<string, LoginInfo>
{
private readonly SignalRSrv outerInstance;
public SubscriptionHandler2AnonymousInnerClass(SignalRSrv outerInstance)
{
this.outerInstance = outerInstance;
}
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: @Override public void run(final String msg,final LoginInfo loginInfo)
public override void run(string msg, LoginInfo loginInfo)
{
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final String finalMsg = loginInfo.FullName + " says " + loginInfo.Password;
string finalMsg = loginInfo.FullName + " says " + loginInfo.Password;
Intent intent = new Intent();
intent.Action = MY_ACTION;
intent.PutExtra("DATAPASSED", finalMsg);
sendBroadcast(intent);
}
}
当然,这在 Visual Studio 2017 中产生了几个错误。
首先,Platform.loadPlatformComponent(new AndroidPlatformComponent()); 行生成了错误Platform is inaccessible due to its protection level。 Xamarin for Visual Studio 2017 中的Platform 确实受到保护,并且是System 中的一个内部类,我无法更改它,所以我不知道如何继续它。同一行会生成错误The type or namespace name 'AndroidPlatformComponent' could not be found,这些错误很多而且并不意外我只是在 Visual Studio 2017 中找不到与AndroidPlatformComponent 等效的错误,所以我不知道如何解决这个错误。
接下来,在这一行ClientTransport clientTransport = new ServerSentEventsTransport(mInstance.mHubConnection.Logger); 生成错误The type or namespace name 'ClientTransport' could not be found,我也无法找到与此相同的等效项,我再次不知所措。同样在这一行上,.Logger 没有为集线器连接定义,显然它是 java 中的.getLogger(),我也找不到这个的等价物。
在SignalRFuture<Void> signalRFuture = mInstance.mHubConnection.Start(clientTransport);' generates the error 1The type or namespace name 'SignalRFuture<>' could not be found 的下一行,这似乎是 SignalR 特有的,再次,我找不到等效项。
下一个让我完全被难住了,private class SubscriptionHandler2AnonymousInnerClass : SubscriptionHandler2<string, LoginInfo> 行生成了错误The type or namespace name 'SubscriptionHandler2<,>' could not be found。我在网上到处查看并阅读了 AnonymousInnerClass,但对此无济于事。
我希望这里的用户更熟悉 SignalR 以及 c# 功能和 java 功能之间的区别。我对java一点也不熟悉,对SignalR和前台服务也不熟悉。
【问题讨论】:
-
据我了解
Platform不应该是系统命名空间的一部分!! -
我相信不是。我一直在阅读java,所以我可以理解这里发生了什么,并且从我读过的内容中我相信该方法正在连接一个事件,因此它可以将消息传递回应用程序。我正在推进这个前提,我们会看看会发生什么。
-
你能告诉我你从哪里得到 SingalR dll 吗?
-
SignalR 在 Nuget 上可用,.NET 有两个版本。 Microsoft.AspNet.SignalR 和 Microsoft.AspNetCore.SignalR。我无法解决 Microsoft.AspNetCore.Signalr 的问题并放弃了它,但它是 SignalR 的当前版本。你在使用 Visual Studios 吗?
-
你可以试试这些博客montemagno.com/real-time-communication-for-mobile-with-signalr 或c-sharpcorner.com/article/… 是的,我一直在使用VS
标签: java c# android xamarin.android visual-studio-2017