我想创建一个Service
,它能够创建许多对象,其中每个对象连接到互联网并下载一些JSON数据和照片。其中大部分是非常直接的,但我希望它一次发生一次,即一个新的对象不能创建,直到第一个对象完成其操作。如何知道对象何时执行了操作?
什么是我的Service
知道对象何时执行其操作的最佳方式?
这里是什么,我正在寻找一个非常粗略的说明:
我想创建一个Service
,它能够创建许多对象,其中每个对象连接到互联网并下载一些JSON数据和照片。其中大部分是非常直接的,但我希望它一次发生一次,即一个新的对象不能创建,直到第一个对象完成其操作。如何知道对象何时执行了操作?
什么是我的Service
知道对象何时执行其操作的最佳方式?
这里是什么,我正在寻找一个非常粗略的说明:
这个怎么样?当对象创建完成时,广播一个意图(例如,如果您希望它是私有的,则可以使用LocalBroadcast
)。
在您的Service
中,注册上述广播,并在接收到广播时执行下一个任务。
使用IntentService
。在正常使用情况下,它接收到的每个Intent
都按顺序处理,并且已处于后台线程中,因此您甚至不需要在AsyncTask
中执行网络活动。简单。
或者,把所有的东西都放在Queue
中,并且由于AsyncTask
中的呼叫而发生“做下一件事”呼叫。
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();
我想你已经误解了这个问题。我不打算创建一些意向或服务。我需要从一个服务创建对象。 – 2012-01-27 01:34:26
'IntentService'实现 - 你扩展了操作系统提供的 - 会创建对象而不会阻碍对方。然后,您可以随意将创建的对象发送到任何地方。 – Argyle 2012-01-27 01:36:28
我没有使用Intents,我正在使用对象。 – 2012-01-27 01:37:58
使用监听器。将后台服务注册为对象实例的侦听器,并且在对象实例处于启用状态时,它只会回调所有侦听器。
还有其他限制吗?为什么你不能在对象实例中保留对服务的引用(反之亦然,如果你担心对象将是GC),并且当你完成时你调用服务中的方法? – Luis 2012-01-27 01:33:45
我以前一直在调用服务中的一种方法,但我想知道是否有更好的方法来做到这一点。这似乎有点顽皮:) – 2012-01-27 01:36:06