Как отправить сообщение через 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); //инициализация