Вопрос

У меня есть класс, который извлекает данные в ответ на нажатия кнопок в основном действии.К сожалению, я продолжаю сталкиваться с проблемами, потому что этот класс не является действием или службой.Например, без контекста я не могу перевести идентификатор ресурса в строку:

getString(R.string.example_string); // Doesn't work

Должен ли я превратить этот класс в Службу и сделать так, чтобы основное действие останавливало класс, когда он закрывается?Должен ли я передать контекст из действия в этот класс следующим образом?

MyClass c = new MyClass(this);

Или есть лучший способ справиться с этой проблемой?

Эта проблема также возникает, когда я пытаюсь отправить Toast из этого класса.

Обновлять: Эрих и Януш указали мне в сторону AsyncTask класс, который работает отлично, за исключением того, что он создает новый поток и никогда не уничтожает этот поток.Это означает, что каждый раз, когда пользователь нажимает кнопку, добавляется еще один поток, а старые просто остаются там.

Это было полезно?

Решение

Если у вас есть фоновое действие, жизненный цикл которого отделен от вашей активности, я бы использовал Service.В этом случае Service будет свой собственный Context, поэтому вам не нужно будет его передавать.Однако если вам необходимо выполнить фоновое действие в ответ на событие пользовательского интерфейса (и при необходимости опубликовать результаты обратно в поток пользовательского интерфейса), я бы рекомендовал вам использовать AsyncTask.

Другие советы

Я согласен с Эрихом, если у вас есть только что-то маленькое, например, публикация изменения в веб-сервере или загрузка чего-то из памяти телефона, чтобы отобразить это на экране, используйте Асинхронная задача.Если задача завершится очень «быстро» (несколько секунд), вы можете создать анонимный класс внутри своей деятельности.Это позволит вам использовать неявную ссылку на внешнее действие внутри задачи и получить оттуда контекст.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top