EditText очищает перед использованием содержимого - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь реализовать клиент WebSocket в Android Studio.

Мой код работает нормально, но я хотел бы очистить текстовые поля после того, как данные были установлены.Когда я попытался очистить свои поля EditText после нажатия кнопки «ОТПРАВИТЬ», я обнаружил, что они очищались перед их использованием.

Если я использую следующий код, содержимое текстовых полей получаетотправлено,

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        start  = (Button) findViewById(R.id.send);
        output = (TextView) findViewById(R.id.output);
        client = new OkHttpClient();
        add    = (EditText) findViewById(R.id.add_str);
        cmd    = (EditText) findViewById(R.id.cmd_str);
        key    = (EditText) findViewById(R.id.key_str);
        data   = (EditText) findViewById(R.id.data_str);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                start();
            }
        });
    }

Но если я использую следующее ...

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    start  = (Button) findViewById(R.id.send);
    output = (TextView) findViewById(R.id.output);
    client = new OkHttpClient();
    add    = (EditText) findViewById(R.id.add_str);
    cmd    = (EditText) findViewById(R.id.cmd_str);
    key    = (EditText) findViewById(R.id.key_str);
    data   = (EditText) findViewById(R.id.data_str);

    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            start();
            add.getText().clear();
            cmd.getText().clear();
            key.getText().clear();
            data.getText().clear();
        }
    });
}

Я просто получаю пустую строку.Как мне это остановить?Я попытался установить флаг отправки, который устанавливается только после того, как текст был отправлен ...

start.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        start();
        if (sent){
            add.getText().clear();
            cmd.getText().clear();
            key.getText().clear();
            data.getText().clear(); 
            sent = false; 
        }
    }
});

... но текст никогда не очищается.

Редактировать #1: Полный список MainActivity

package qdivision.org.websocketexample;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;

public class MainActivity extends AppCompatActivity {

    private Button start;
    private TextView output;
    private OkHttpClient client;

    public EditText add;
    public EditText cmd;
    public EditText key;
    public EditText data;

    public boolean sent = false;


    private final class EchoWebSocketListener extends WebSocketListener {
        private static final int NORMAL_CLOSURE_STATUS = 1000;

        @Override
        public void onOpen(WebSocket webSocket, Response response) {

            String addStr    = add.getText().toString();
            String cmdStr    = cmd.getText().toString();
            String keyStr    = key.getText().toString();
            String dataStr   = data.getText().toString();
            String dataFrame = "<" + addStr + "," + cmdStr + "," + keyStr + "," + dataStr + ">";
            webSocket.send(dataFrame);

            webSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye !");
            sent = true;
        }

        @Override
        public void onMessage(WebSocket webSocket, String text) {
            output("Receiving : " + text);
        }

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

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

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        start  = (Button) findViewById(R.id.send);
        output = (TextView) findViewById(R.id.output);
        client = new OkHttpClient();
        add    = (EditText) findViewById(R.id.add_str);
        cmd    = (EditText) findViewById(R.id.cmd_str);
        key    = (EditText) findViewById(R.id.key_str);
        data   = (EditText) findViewById(R.id.data_str);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                start();
                /*add.getText().clear();
                cmd.getText().clear();
                key.getText().clear();
                data.getText().clear();*/
            }
        });
    }

    private void start() {
        Request request = new Request.Builder().url("ws://192.168.1.84:81/").build(); //"ws://echo.websocket.org"
        EchoWebSocketListener listener = new EchoWebSocketListener();
        WebSocket ws = client.newWebSocket(request, listener);

        client.dispatcher().executorService().shutdown();
    }

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

Ответы [ 4 ]

1 голос
/ 14 мая 2019

Поскольку onOpen происходит асинхронно, значения, которые вы пытаетесь передать, к этому времени уже очищены.Простейшим способом было бы присвоить значения из ваших EditTexts переменным, а затем прочитать их в onOpen.Вы также можете добавить конструктор к вашей реализации Websocket, который принимает String в качестве параметра.

1 голос
/ 14 мая 2019

Прежде всего, о sent flag. Если вы используете другой поток для настройки его значения, это не значит, что этот поток должен ждать, пока он прочитает значение. В if statement, если это не так, он пропустит тело. Таким образом, как только вызывается start(), предполагая, что start() работает в другом потоке, этот поток будет читать следующий оператор и пропустить цикл. Попробуйте использовать что-то вроде OnCompleteListener(), предоставляемое с API, который вы используете. Та же самая логика идет с editText.getText().clear(). Если вы пытаетесь прочитать текст в start() после любого HTTP-вызова, программа не будет ждать его и выполнит оставшиеся операторы. Надеюсь, это поможет

0 голосов
/ 14 мая 2019
editText.getText().clear(); 

очистит текстовое поле.

0 голосов
/ 14 мая 2019

Может быть, вы можете попробовать:

data.setText(""); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...