2012-01-27 2 views
0

Я хотел бы создать Service, способный создавать несколько объектов, где каждый объект подключается к Интернету и загружает некоторые данные JSON и фотографию. Большая часть этого довольно прямолинейна, но я хочу, чтобы это происходило по одному, т. Е. Новый объект не может быть создан до тех пор, пока первый объект не завершит свои действия.Как узнать, когда объект выполнил действие?

Каков наилучший способ для моего Service знать, когда объект выполнил свои действия?

Вот очень грубая иллюстрация того, что я ищу:

enter image description here

+0

Какое еще ограничение существует? почему вы не можете хранить ссылку в экземпляре объекта в службе (и наоборот, если вы боитесь, что объект будет GC), и когда вы закончите, вы вызываете метод в службе? – Luis

+0

Я ранее вызывал метод в Сервисе, но мне было интересно, есть ли лучший способ сделать это. Кажется, немного непослушным это сделать :) –

ответ

1

Как насчет этого? Когда создание объекта завершено, передайте намерение (например, вы можете использовать LocalBroadcast, если хотите, чтобы он был закрытым).

В вашем Service зарегистрируйтесь для вышеупомянутой трансляции, и когда она будет получена, выполните следующую задачу.

2

Используйте IntentService. При нормальном использовании каждый полученный Intent обрабатывается последовательно и уже находится в фоновом потоке, поэтому вам даже не нужно выполнять сетевую активность в AsyncTask. Легко.

В качестве альтернативы, положите все свои вещи в Queue и получите вызов «сделать следующее» в результате вызова onPostExecute() в AsyncTask s.

Queue<YourObject> unfinished = getQueue(); 
List<YourObject> finished = new LinkedList<YourObject>(); 
Handler handler = new Handler(){ 
    handleMessage(Message m){ 
    // Object populated! Start next? Blink lights? Whatever. 
    } 
} 

AsyncTask t = new AsyncTask<...>(handler) { 
    Handler h; 
    public AsyncTask<...>(Handler h) { 
    this.h = h; 
    } 

    protected V doInBackground(YourObject o) { 
    // Network stuff, populate the thing 
    return popualtedThing(); 
    } 

    protected V onPostExecute(YourObject o) { 
    h.sendMessage(Message.obtain(0,o); 
    } 
}.execute(); 
+0

Я думаю, вы неправильно поняли этот вопрос. Я не собираюсь создавать ряд намерений или сервисов. Мне нужно создать объекты из Сервиса. –

+0

Реализация «IntentService» - вы расширяете ту, которая предоставляется ОС - создавала бы объекты, не мешая друг другу. Затем вы можете отправлять созданные объекты туда, где хотите. – Argyle

+0

Я не использую намерения, я использую объекты. –

1

Использование слушателей. Если фоновый сервис зарегистрирован как слушатель экземпляра объекта, а когда экземпляр объекта - это просто обратный вызов всем слушателям.

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