Почему бы не обновить элементы интерфейса в Android - PullRequest
0 голосов
/ 08 марта 2020

В моем приложении я должен использовать socket.io , и я хочу, чтобы при получении обновления моего события UI элементы!
Я пишу коды ниже и получаю, что мои события показывают мне логи , но не обновлять пользовательский интерфейс!

Я хочу, чтобы при получении события проверил, является ли этот победитель пользователем или нет, а затем обновите мой пользовательский интерфейс.
В logCat покажи мне мой logs но не обновляется любые элементы пользовательского интерфейса !

Мои коды:

public void onsocketFinishRecieve(final JSONObject ob) {
        try {
            ((BaseActivity) context).runOnUiThread(() -> {
                try {
                    cancelTimer();
                    final FinishResponse finishResponse = new Gson().fromJson(ob.toString(), FinishResponse.class);
                    if (finishResponse.getRes().getWinnerName().equals("not user") || finishResponse.getRes().getWinnerName().equals("not winner")) {
                        winnerNameWhenFinished = "Not winner";
                    } else {
                        winnerNameWhenFinished = finishResponse.getRes().getWinnerName();
                    }
                    if (detail.getId() != null) {
                        if (detail.getId() == finishResponse.getRes().getId()) {
                            //Set new winner layouts
                            //Register in auction
                                if (Constants.profileResponse != null) {
                                    if (Constants.profileResponse.getRes() != null) {
                                        if (Constants.profileResponse.getRes().getUser() != null) {
                                            //Winner
                                            if (Constants.profileResponse.getRes().getUser().getId().equals(finishResponse.getRes().getUserId())) {
                                                Log.e("FinishedSocket", "1");
                                                detailPage_bottomWinnerRateTxt.setVisibility(View.GONE);
                                                detailPage_bottomWinnerBuyTxt.setText("Show basket");
                                                detailPage_bottomWinnerBuyTxt.setOnClickListener(v -> {
                                                    Intent intent = new Intent(context, MainActivity.class);
                                                    intent.putExtra("OPEN_CART_IN_MAIN", "true");
                                                    startActivity(intent);
                                                });
                                            } else {
                                                Log.e("FinishedSocket", "2");
                                                //Loser
                                                detailPage_bottomWinnerBuyTxt.setText("Awesome offers");
                                            }
                                        }
                                    }
                                }
                        }
                    }
                } catch (Exception e) {
                    Log.e("DetailResErr", e.getMessage());
                }
            });
        } catch (Exception e) {
            Log.e("DetailResErr", e.getMessage());
        }
    }

Logcat message:

2020-03-08 13:37:37.399 E/FinishedSocket: 2

В logcat покажите мне выше сообщение , почему бы не запустить эту строку: detailPage_bottomWinnerBuyTxt.setText("Awesome offers"); ??

Как можно я это исправлю?

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Сокеты работают на IOThread, в то время как другой интерфейс пользователя работает на отдельном потоке, называемом потоком пользовательского интерфейса. Итак, обновите элемент пользовательского интерфейса в потоке пользовательского интерфейса. Используйте аннотацию:

@ UiThread
publi c abstract void setText (@NonNull String text) {...}

Для получения информации о дополнительных аннотациях, Проверьте следующий блог: https://medium.com/@gurwindersingh_37022 / android -annotations-30b4a2850d0

0 голосов
/ 08 марта 2020

попробуйте запустить это в Mainthread следующим образом.

someActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
           //Your code to run in GUI thread here
           detailPage_bottomWinnerBuyTxt.setText("Awesome offers");
        }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...