Android приложение не читает из входного потока Socket - PullRequest
0 голосов
/ 07 апреля 2020

Мое android приложение по какой-то причине не получает никаких данных с моего сервера. Как ни странно, другой клиент сокетов, который я написал (который работает на моем компьютере, а не AVD), получает и печатает все отправленные сервером сообщения без ошибок. Он использует код, аналогичный тому, который содержится в методе doInBackground.

public class Client extends AsyncTask<Void, Void, Void>  {

    int port;
    Socket s;

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            port = 1818;
            s = new Socket("xx.xx.xx.xx", port);
            if (!s.isConnected()) {
                s.close();
            }

            BufferedReader re = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String temp = null;

            while ((temp = re.readLine()) != null)
            {
                MainActivity.changeT(temp); // This will replace the TextView's text with temp.
            }

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }
}

Я думаю, что возможным решением было бы поместить while l oop в отдельный поток, но я не уверен. Любые предложения приветствуются! : -)

1 Ответ

0 голосов
/ 08 апреля 2020

Когда приложение обращалось к серверу соответствующим образом, MainActivity.changeT(temp); пытается получить доступ к потоку пользовательского интерфейса из фонового потока, что не подходит.

Я решил эту проблему, передав экземпляр MainActivity этому Клиентский класс, и я использовал runnable метод runOnUiThread(...).

public class Client extends AsyncTask<Void, Void, Void> {

    int port;
    Socket s;
    MainActivity instance;

    Client(MainActivity instance)
    {
        this.instance = instance;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            port = 1818;
            s = new Socket("xx.xx.xx.xx", port);
            if (!s.isConnected()) {
                s.close();
                return null;
            }

            BufferedReader re = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String temp = null;
            TextView t = instance.getT(); // Accesses a getter method that returns the TextView.

            while ((temp = re.readLine()) != null)
            {
                setText(t, temp); // Accesses the UI Thread and changes the TextView.
            }

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    private void setText(final TextView text,final String value){
        instance.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                text.setText(value); // This is equivalent to writing the code in the UI thread itself.
            }
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...