Ответы пользователя по тегу Java
  • Почему происходит дублирование запуска сервиса?

    @5465
    Вероятнее всего проблема заключается в том, что BroadcastReceiver UnlockMonitoringReceiver зарегистрирован несколько раз, что приводит к вызову метода unlocktoserver() несколько раз.

    Попробуйте проверить, не зарегистрирован ли BroadcastReceiver UnlockMonitoringReceiver в вашем коде более одного раза. Если он зарегистрирован несколько раз, то вам нужно удалить все лишние регистрации BroadcastReceiver'ов.

    Также возможно, что ваша система запускает несколько копий сервиса UnlockMonitoringService, поэтому вам может потребоваться проверить это, например, добавив логирование в метод onStartCommand() для отслеживания количества вызовов.

    Пример кода, который может помочь выявить причину дублирования запуска сервиса:

    public class MyService extends Service {
        private int counter = 0;
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.i("MyService", "onStartCommand() called. counter = " + counter);
    
            // Увеличиваем значение счетчика
            counter++;
    
            // Возвращаем значение START_STICKY
            return Service.START_STICKY;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.i("MyService", "onDestroy() called.");
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    }


    Этот сервис просто увеличивает значение счетчика каждый раз, когда вызывается метод onStartCommand(). Вы можете использовать этот код в своем проекте, чтобы отследить количество вызовов метода onStartCommand() и убедиться, что сервис не запускается несколько раз.
    Ответ написан
  • Почему получаю пустой RecyclerView?

    @5465
    Возможно проблема в том, что вы не разобрали JSON-ответ, чтобы получить список из нужных вам объектов. В вашем случае вы пытаетесь получить список из массива food, но этого массива нет в JSON-ответе, который вы получаете. Вместо этого у вас есть вложенный массив parsed, который содержит объекты, содержащие информацию о еде.

    Чтобы получить список из этих объектов, вам нужно будет сначала получить массив parsed из вашего JSON-ответа, а затем перебрать его и извлечь каждый объект food из каждого элемента массива. Вот пример, как это можно сделать:

    @Override
    protected void onPostExecute(String s) {
        try {
            JSONObject jsonObject = new JSONObject(s);
            JSONArray parsedArray = jsonObject.getJSONArray("parsed");
    
            for (int i = 0; i < parsedArray.length(); i++) {
                JSONObject parsedObject = parsedArray.getJSONObject(i);
                JSONObject foodObject = parsedObject.getJSONObject("food");
    
                FoodModels model = new FoodModels();
                model.setName(foodObject.getString("label"));
                model.setImg(foodObject.getString("image"));
                model.setKcal(foodObject.getJSONObject("nutrients").getString("ENERC_KCAL"));
                model.setProcent(foodObject.getJSONObject("nutrients").getString("PROCNT"));
                model.setFat(foodObject.getJSONObject("nutrients").getString("FAT"));
                model.setChocdf(foodObject.getJSONObject("nutrients").getString("CHOCDF"));
                model.setFidtg(foodObject.getJSONObject("nutrients").getString("FIBTG"));
    
                foodModelsList.add(model);
            }
    
        } catch (JSONException e) {
            e.printStackTrace();
        }
    
        PutDataIntoRecyclerView(foodModelsList);
    }


    Здесь мы получаем массив parsed из JSON-ответа, затем перебираем его и для каждого объекта извлекаем объект food. Затем мы используем данные из объекта food, чтобы создать новый объект FoodModels и добавляем его в наш список foodModelsList. Когда мы закончили, мы вызываем PutDataIntoRecyclerView, чтобы заполнить RecyclerView нашим списком данных.
    Ответ написан
    Комментировать
  • Почему я получаю не полный список в RecyclerView?

    @5465
    Возможно, вы получаете не полный список в RecyclerView, потому что у вас есть ограничение на количество элементов, которые могут отображаться одновременно в RecyclerView. Это ограничение может быть установлено в параметре android:layout_height вашего RecyclerView. Если вы хотите, чтобы все элементы были отображены, вы можете использовать параметр wrap_content для android:layout_height.

    Например:

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


    Если это не решает проблему, пожалуйста, уточните, какие именно элементы отображаются в вашем RecyclerView.
    Ответ написан
    Комментировать
  • Jakarta mail MessageCountListener как правильно использовать?

    @5465
    Для использования слушателя на папку сообщений в Jakarta Mail, необходимо создать экземпляр javax.mail.Store и подключиться к почтовому ящику с помощью метода store.connect().

    Затем нужно получить объект папки, на которую будет установлен слушатель с помощью метода store.getFolder(). Установить слушателя можно вызвав метод folder.addMessageCountListener(), передав в качестве параметра экземпляр класса, реализующего интерфейс javax.mail.event.MessageCountListener.

    В вашем примере вы правильно устанавливаете слушателя на папку с помощью метода folder.addMessageCountListener(). Однако, чтобы программа не завершалась до срабатывания слушателя, необходимо вставить бесконечный цикл, который будет ожидать событий. Например:

    public static void main(String[] args) throws MessagingException {
        // Подключаемся к почтовому ящику
        Store store = Session.getDefaultInstance(new Properties()).getStore("имя_протокола");
        store.connect("хост", "логин", "пароль");
    
        // Получаем папку
        Folder folder = store.getFolder("inbox");
    
        // Устанавливаем слушателя
        folder.addMessageCountListener(new MessageCountListener() {
            @Override
            public void messagesAdded(MessageCountEvent messageCountEvent) {
                Message[] messages = messageCountEvent.getMessages();
                if(messages.length!=0){
                    for (Message s :
                            messages) {
                        try {
                            //System.out.println(messages.length);
                            new Downloader().download(s);
                        } catch (MessagingException e) {
                            throw new RuntimeException(e); //todo
                        } catch (IOException e) {
                            throw new RuntimeException(e); //todo
                        }
                    }
                }
            }
        });
    
        // Бесконечный цикл для ожидания событий
        while (true) {
            try {
                Thread.sleep(1000); // Приостанавливаем выполнение на 1 секунду
            } catch (InterruptedException e) {
                // Обработка ошибок
            }
        }
    }


    В этом примере мы создаем бесконечный цикл, который будет ожидать события в папке inbox. Если в папку придут новые сообщения, то будет вызван метод messagesAdded() слушателя, который будет загружать вложения. Если в папку не придут новые сообщения, то программа будет продолжать ждать события.
    Ответ написан
    Комментировать