Проблемы с преобразованием Java в C # - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь преобразовать код, расположенный в Как использовать сигнализатор в службе Android из 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.Platform в Xamarin для Visual Studio 2017 действительно защищен и является внутренним классом в System, и я не могу изменить это, так что я не знаю, как поступить с ним.Эта же строка генерирует ошибку The type or namespace name 'AndroidPlatformComponent' could not be found, эти ошибки - многочисленные и не неожиданные. Я просто не могу найти эквивалент AndroidPlatformComponent в Visual Studio 2017, так что я не знаю, как решить эту проблему.

Далее, в этой строке ClientTransport clientTransport = new ServerSentEventsTransport(mInstance.mHubConnection.Logger); генерирует ошибку The type or namespace name 'ClientTransport' could not be found, я также не смог найти эквивалент этого, и снова я в растерянности, чтобы продолжить.Также в этой строке .Logger не определено для соединения с хабом, по-видимому, это .getLogger() в Java, я не смог найти эквивалент для этого.

Следующая строка 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 и службами переднего плана.

1 Ответ

0 голосов
/ 11 июня 2019

Как оказалось, последний метод в java-коде, который я конвертировал, связывал событие для передачи сообщения, полученного из концентратора, в действие.В c # / Visual Studio (2017) это делается совсем по-другому, поэтому я не понял / не понял, что происходит.Поэтому я создал обработчик в C # и выполнил всплывающее сообщение для сообщения.Это само по себе может создавать проблемы, но, по крайней мере, я знаю, что происходит.Это код, который я написал, чтобы запустить SignalR из службы и обработчик WireUp:

    private void startSignalR()
    {
        // Company, Department, and section are private variables
        // their values are pulled from the intent bundle 
        // in the OnBind method, that code is:
        //     Bundle bundlee = intent.GetBundleExtra("TheBundle");
        //     MyUser = bundlee.GetParcelable("MyUser") as User;
        // This information is put into the bundle when the user is logged in.
        // I then pass that information to the SignalR client 
        // when I set the hub connection and placed on the querystring to the hub.

        mInstance.setmHubConnection(username, firstname,lastname,company,department,section);
        mInstance.setHubProxy();

        try
        {
            // Connect the client to the hup
            mInstance.mHubConnection.Start();
            // Set the event handler
            mInstance.WireUp();

        }
        catch (System.Exception e) when (e is InterruptedException || e is ExecutionException)
        {
            ShowMessage("Error: + e.Message)
        }
    }

Это код WireUp, это метод в коде клиента:

    public void WireUp()
    {
        // set the event handler
        mHubProxy.On("broadcastMessage", (string platform, string message) =>
        {
            if (OnMessageReceived != null)
                OnMessageReceived(this, string.Format("{0}: {1}", platform, message));
        });
    }

Как я и ожидал, всплывающее сообщение не появится, когда приложение находится в фоновом режиме, поэтому я исследую обходной путь

...