我正在使用Xamarin Forms开发一个应用程序,该应用程序使用Signalr服务来实现聊天。该聊天在UWP版本和Android模拟器中均能完美运行,因此当我在手机(Android)上进行调试时也是如此,但是当我将手机与PC断开连接时,混乱便开始了。问题是我认为当应用程序进入后台时,它会与Signalr服务器断开连接。
我尝试过自动重新连接,甚至更改ServerTimeout和KeepAliveInterval的时间。但是我没有成功。应该注意的是,我另外居住的地方还存在主要的连通性问题,但是我的理论仍然是当应用程序转到后台时。
这是我的代码,用于初始化服务(我使用Singleton服务)。
hubConnection = new HubConnectionBuilder()
.WithUrl(URL, options =>
{
options.AccessTokenProvider = () => Task.FromResult(_myAccessToken);
})
.WithAutomaticReconnect()
//.WithAutomaticReconnect(new[] { TimeSpan.Zero, TimeSpan.Zero, TimeSpan.FromSeconds(10) })
//.WithAutomaticReconnect(new RandomRetryPolicy())
.Build();
这是我在关闭连接时要连接的代码
hubConnection.Closed += async (error) =>
{
OnConnectionClosed?.Invoke(this, new MessageEventArgs("Connection closed...",
string.Empty));
IsConnected = false;
await Task.Delay(new Random().Next(0, 5) * 1000);
try { await ReConnectAsync(); } catch (Exception ex) { Debug.WriteLine(ex); }
};
这是我要连接的代码
public async Task ReConnectAsync()
{
await ConnectAsync();
}
public async Task ConnectAsync()
{
if (IsConnected)
{
return;
}
Debug.WriteLine(hubConnection.State);
if (hubConnection.State== HubConnectionState.Disconnected)
{
await hubConnection.StartAsync();
//CancellationToken cancellationToken = new CancellationToken();
//await ConnectWithRetryAsync(hubConnection, cancellationToken);
}
IsConnected = true;
}
我还能尝试阻止它在Android上断开连接还是在代码中做错什么?
答案 0 :(得分:2)
除非运行了Foreground Service(从本质上使App保持运行),否则您将无法在Android上保持SignalR连接处于活动状态。音乐应用程序等可以这样在后台保持运行状态。
前台服务还需要向用户显示其正在运行的通知。
Xamarin提供了一个很好的小示例,展示了如何在https://github.com/xamarin/monodroid-samples/tree/master/ApplicationFundamentals/ServiceSamples/ForegroundServiceDemo
处创建前台服务。基本上,您创建服务:
[Service]
public class MyForegroundService : Service
{
}
然后,从您的“活动”中启动一个意图:
var intent = new Intent(this, typeof(MyForegroundService));
StartForegroundService(intent);
在您的服务中,您需要通过StartForeground
覆盖调用OnStartCommand
,否则该服务将被终止。
尽管有疑问。您是否真的需要前台服务并在后台继续运行SignalR?
您是否考虑过不时轮询后端以获取最新消息?
您是否考虑过在用户收到新消息时发送推送通知?
如果您决定同时定位iOS,则会遇到更大的限制。您将无法保持SignalR连接保持活动状态。