Как отправить сообщение через webSocket.send() по кнопке

Этот код, который нашел в интернете, отправляет сообщение каждые 10 секунд. Я создал обработчик кнопки, но я не могу просто прописать в нем webSocket.send("Сообщение"), он не видит эту переменную и не может сделать это. Как тут реализовать, зачем то полез в то, что еще не понимаю...

public class MainActivity extends AppCompatActivity {

    private TextView tvOutput;
    private Button btn;

    private static final int NORMAL_CLOSURE_STATUS = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvOutput = findViewById(R.id.output);
        btn = findViewById(R.id.btn);

        // WebSocket
        Request request = new Request.Builder().url("ws://192.168.1.3:81").build();
        EchoWebSocketListener listener = new EchoWebSocketListener();
        OkHttpClient okHttpClient = new OkHttpClient();
        final WebSocket webSocket = okHttpClient.newWebSocket(request, listener);
        okHttpClient.dispatcher().executorService().shutdown();

        // Отправка сообщения каждые 10 секунд
        final Handler pingHandler = new Handler();
        Runnable pingRunnable = new Runnable() {
            @Override public void run() {
                String ping = "t";
                output("Tx: " + ping);
                webSocket.send(ping);
                pingHandler.postDelayed(this, 10000);
            }
        };
        pingHandler.postDelayed(pingRunnable, 10000);
    }

    public void send_msg(View view) {
        // Как отправить webSocket.send("Сообщение");
    }

    // WebSocket
    private final class EchoWebSocketListener extends WebSocketListener {
        @Override
        public void onOpen(WebSocket webSocket, Response response) {
            output("WebSocket connected to ws://192.168.1.5:81");
        }

        @Override
        public void onMessage(WebSocket webSocket, String text) {
            output("Rx: " + text);
            // Check the WebSocket message type
            if (text.contains("chat")) {
                // do something chat related
            }
        }

        @Override
        public void onMessage(WebSocket webSocket, ByteString bytes) {
            output("Rx bytes: " + bytes.hex());
        }

        @Override
        public void onClosing(WebSocket webSocket, int code, String reason) {
            webSocket.close(NORMAL_CLOSURE_STATUS, null);
            output("Closed: " + code + " / " + reason);
        }

        @Override
        public void onFailure(WebSocket webSocket, Throwable t, Response response) {
            output("Error: " + t.getMessage());
        }
    }

    private void output(final String txt) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvOutput.setText(tvOutput.getText().toString() + "\n\n" + txt);
            }
        });
    }
}

Ответы (1 шт):

Автор решения: igo

Дело в том что объект WebSocket webSocket объявлен в методе onCreate, а значит доступен только внутри этого метода.

Вам нужно вынести переменную из метода в класс MainActivity рядом с private Button btn; а в методе onCreate лишь инициализировать эту переменную. И тогда вы сможете обращаться к объекту webSocket из любого места в вашем классе.

public class MainActivity extends AppCompatActivity {

private TextView tvOutput;
private Button btn;
private WebSocket webSocket;  //объявляем переменную доступную для всего класса 

...

@Override
protected void onCreate(Bundle savedInstanceState) {

     ...

     webSocket = okHttpClient.newWebSocket(request, listener);  //инициализация
→ Ссылка