【发布时间】:2015-12-10 23:41:45
【问题描述】:
我正在尝试将 signalR 集成到 android 应用程序中,但没有成功。我一直在查看各种链接,但没有一个提供有关实施的正确信息。
我有以下问题。
-
SignalR集成必须在 Service/Intent Service 内部完成? - 如果我们想通过相同的调用方法接收响应,那么如何获取?
我添加了三个库,即signalr android、signalr client 和gson,但无法理解代码的工作原理,没有合适的文档来理解代码。
问了一些问题,但信息不多
SignalR in Android Studio Unable to implement p2p chat using SignalR in Android
如果有人在本机应用程序的信号方面有经验,那对我很有帮助。
更新
public class SignalRService extends Service {
private static final String TAG = "Service";
private HubConnection mHubConnection;
private HubProxy mHubProxy;
private Handler mHandler; // to display Toast message
private final IBinder mBinder = new LocalBinder();
private SharedPreferences sp;
@Override
public void onCreate() {
super.onCreate();
Utility.showLog(TAG, "Service Created");
sp = getSharedPreferences(Utility.SHARED_PREFS, MODE_PRIVATE);
mHandler = new Handler(Looper.myLooper());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int result = super.onStartCommand(intent, flags, startId);
startSignalR();
return result;
}
@Override
public IBinder onBind(Intent intent) {
startSignalR();
return mBinder;
}
/**
* Class used for the client Binder. Because we know this service always
* runs in the same process as its clients, we don't need to deal with IPC.
*/
public class LocalBinder extends Binder {
public SignalRService getService() {
// Return this instance of SignalRService so clients can call public methods
return SignalRService.this;
}
}
/**
* method for clients (activities)
*/
public void sendMessage() {
String SERVER_METHOD_SEND = "iAmAvailable";
final String string = new String();
mHubProxy.invoke(new String(), SERVER_METHOD_SEND, sp.getString("user_id", null), sp.getString("pass", null), "TransMedic").done(new Action() {
@Override
public void run(Object o) throws Exception {
Utility.showLog(TAG, o.toString());
}
}).onError(new ErrorCallback() {
@Override
public void onError(Throwable throwable) {
}
});
}
private void startSignalR() {
Platform.loadPlatformComponent(new AndroidPlatformComponent());
String serverUrl = "http://transit.alwaysaware.org/signalr";
mHubConnection = new HubConnection(serverUrl);
String SERVER_HUB_CHAT = "ChatHub";
mHubProxy = mHubConnection.createHubProxy(SERVER_HUB_CHAT);
ClientTransport clientTransport = new ServerSentEventsTransport(mHubConnection.getLogger());
SignalRFuture<Void> signalRFuture = mHubConnection.start(clientTransport);
try {
signalRFuture.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
return;
}
sendMessage();
}
@Override
public void onDestroy() {
mHubConnection.stop();
super.onDestroy();
}
}
【问题讨论】:
-
你的“mHubProxy.invoke”看起来和我的不一样,不知道是不是和你的服务器Hub定义一样。它的第一个参数是一个空白字符串?此外,你在哪里使用“字符串”变量?
-
@BNK 我想从调用接收回调,为此我使用了 new String()
-
嗨!现在我了解了您对调用响应的想法,您使用
public <E> SignalRFuture<E> invoke(final Class<E> resultClass, final String method, Object... args):) -
为什么不试试
String.class而不是new String()比如mHub.invoke(String.class, "hello", "123").done(new Action<String>() { @Override public void run(String s) throws Exception { } }).onError(new ErrorCallback() { @Override public void onError(Throwable throwable) { } }); -
我刚刚用你的服务器Url
http://transit.alwaysaware.org/signalr测试过,可能你的服务器Hub名字不是ChatHub,因为我的app得到了[InvalidOperationException]: &#39;chathub&#39; Hub could not be resolved.
标签: c# android .net asp.net-mvc signalr