Android используя LocalBroadcastManager внутри android Сервис - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь использовать LocalBroadcastManager внутри службы android.

public class WebSocketService extends Service {

    private static final String TAG = "WebSocketService";
    private WebSocketClient mWebSocketClient;

    public WebSocketService() {
        connectWebSocket();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private void connectWebSocket() {
        URI uri;
        try {
            uri = new URI("wss://echo.websocket.org");
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return;
        }


        mWebSocketClient = new WebSocketClient(uri) {
            @Override
            public void onOpen(ServerHandshake serverHandshake) {
                Log.i(TAG, "Websocket Opened");
                mWebSocketClient.send("Hello from " + Build.MANUFACTURER + " " + Build.MODEL);
            }

            @Override
            public void onMessage(String message) {
                Log.i(TAG, "Websocket Received: " + message);

                Intent broadcastIntent = new Intent("custom-event");
                broadcastIntent.putExtra("message", message);
                LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(broadcastIntent);
            }

            @Override
            public void onClose(int code, String reason, boolean remote) {
                Log.i(TAG, "Websocket closed: " + reason);
            }

            @Override
            public void onError(Exception ex) {
                Log.i(TAG, "Websocket error");
            }
        };
    }

    public void sendMessage(String message) {
        mWebSocketClient.send(message);
    }
}

Основное действие, в котором создается веб-сокет.

public class MainActivity extends Activity {

    private WebSocketService webSocketService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webSocketService = new WebSocketService();
    }

    public void send(View view) {
        webSocketService.sendMessage("socket message");
    }
}

и его xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        android:onClick="send"
        tools:layout_editor_absoluteX="166dp"
        tools:layout_editor_absoluteY="288dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

Выше не компилируется за исключением

После изменения LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent); на LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(broadcastIntent);

Я получаю ошибку Error Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference

My Вопрос в том, возможно ли передать контекст при создании

mWebSocketClient = new WebSocketClient(uri) {
}

, так что можно использовать LocalBroadcastManager или нет?

В общем вопрос, возможно ли получить applicationContext внутри раздражающее пространство имен.

1 Ответ

1 голос
/ 18 апреля 2020

Чтобы получить externalScope this внутри раздражающего метода / внутреннего класса любого java класса, вы можете либо вызвать WebSocketService.this

LocalBroadcastManager.getInstance(WebSocketService.this).sendBroadcast(broadcastIntent);

, либо объявите приватный вспомогательный метод для того же

private WebSocketService getOuterWebSocketService() {
  return this;
}

Теперь вы можете использовать этот метод внутри onMessage , как показано ниже

@Override
public void onMessage(String message) {
  Log.i(TAG, "Websocket Received: " + message);
  Intent broadcastIntent = new Intent("custom-event");
  broadcastIntent.putExtra("message", message);             
  LocalBroadcastManager.getInstance(getOuterWebSocketService()).sendBroadcast(broadcastIntent);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...