TextView setText не обновляет текст в пользовательском интерфейсе Android

#android

#Android

Вопрос:

Я использую ScheduledExecuterService , который извлекает данные через вызов службы через интервал времени. Я пытаюсь обновить a TextView с .setText() помощью, чего не происходит. Текст изменяется при повторном открытии приложения, в противном случае оно не обновляется.

Код:

 ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();


            Runnable task = new Runnable() {
                public void run() {

                    AsyncTask asynctask = new AsyncTask() {
                        @SuppressLint("WrongThread")
                        @Override
                        protected Object doInBackground(Object[] objects) {
                            OkHttpClient client = new OkHttpClient();
                            // tv.setText("abc");
                            Request request = new Request.Builder().url(url_PATH3).build();
                            Response response = null;
                            try {
                                response = client.newCall(request).execute();

                                if (response.isSuccessful()) {
                                    return response.body().string();
                                }  else {
                                    return response;
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }


                            return null;
                        }

                        @Override
                        protected void onPostExecute(Object o) {
                            TextView DT = findViewById(R.id.DateTime);
                            TextView DI = findViewById(R.id.DeviceID);
                            TextView TP = findViewById(R.id.Temperature);
                            String[] AllDevices = o.toString().split(Pattern.quote("},{"));
                            String[] Dev1 = (AllDevices[0].split("":"|-|","));
                            String[] Dev2 = (AllDevices[1].split(","));
                            DI.setText(Dev1[1]   ","   Dev1[2]);
                            TP.setText(Dev1[4]);
                            DT.setText(Dev1[6]);

                            Log.d("test", "msg");

                            Dictionary Device1;


                        }
                    }.execute();

                }
            };
            worker.schedule(task,5,TimeUnit.SECONDS);  

}
  

Надеется на предложения или рекомендации

Ответ №1:

Вероятно, вам следует удалить @SuppressLint("WrongThread") аннотацию, чтобы столкнуться с проблемой: вы запускаете AsyncTask в другом потоке, который пытается обновить поток пользовательского интерфейса. Вложение этого AsyncTask в a Runnable также кажется странным. Самым простым было бы определить interface , который можно использовать для обратного вызова, на onPostExecute() … и позволить Activity или Fragment реализовать это interface , что затем обновит TextView поток пользовательского интерфейса.

Комментарии:

1. Я удаляю @SuppressLint(«WrongThread»), но проблема не решена. Не могли бы вы уточнить, как определить интерфейс для использования в качестве обратного вызова