2010-06-09 2 views
0

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

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

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

MyClass c = new MyClass(this); 

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

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

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

ответ

4

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

+0

спасибо! AsyncTask был именно тем, что я искал. Единственная проблема в том, что поток AsyncTask продолжает работать, даже после вызова onPostExecute(). Поскольку я должен сделать новый экземпляр моего AsyncTask когда-либо, мне нужно его использовать, это приведет к созданию большого количества оставшихся потоков. Как я могу убедиться, что нити умирают? – Computerish

2

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

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

Смежные вопросы