2012-01-27 19 views
0

我想创建一个Service,它能够创建许多对象,其中每个对象连接到互联网并下载一些JSON数据和照片。其中大部分是非常直接的,但我希望它一次发生一次,即一个新的对象不能创建,直到第一个对象完成其操作。如何知道对象何时执行了操作?

什么是我的Service知道对象何时执行其操作的最佳方式?

这里是什么,我正在寻找一个非常粗略的说明:

enter image description here

+0

还有其他限制吗?为什么你不能在对象实例中保留对服务的引用(反之亦然,如果你担心对象将是GC),并且当你完成时你调用服务中的方法? – Luis 2012-01-27 01:33:45

+0

我以前一直在调用服务中的一种方法,但我想知道是否有更好的方法来做到这一点。这似乎有点顽皮:) – 2012-01-27 01:36:06

回答

1

这个怎么样?当对象创建完成时,广播一个意图(例如,如果您希望它是私有的,则可以使用LocalBroadcast)。

在您的Service中,注册上述广播,并在接收到广播时执行下一个任务。

2

使用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(); 
+0

我想你已经误解了这个问题。我不打算创建一些意向或服务。我需要从一个服务创建对象。 – 2012-01-27 01:34:26

+0

'IntentService'实现 - 你扩展了操作系统提供的 - 会创建对象而不会阻碍对方。然后,您可以随意将创建的对象发送到任何地方。 – Argyle 2012-01-27 01:36:28

+0

我没有使用Intents,我正在使用对象。 – 2012-01-27 01:37:58

1

使用监听器。将后台服务注册为对象实例的侦听器,并且在对象实例处于启用状态时,它只会回调所有侦听器。

相关问题