2011-11-03 44 views
1

我正在加载一组要下载的文件,并且我为这些文件中的每一个启动了一个IntentService。问题在于Internet连接问题,如设备断开连接,我将不得不清除或停止IntentService的队列处理。停止/清除互联网关闭时的IntentService队列?

在我的代码有一个while循环中的文件被下载。其中的这个循环运行的条件是:检查Internet连接,我已经用下面的代码完成:

public boolean isOnline() { 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     if(cm != null){ 
      return cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
     } 
     return false; 


} 

我的循环类同于以下内容:

while(.. , isOnline()){ 
    /// Download file 
} 

如果我现在正在队列中下载一个文件,如果互联网停止运行,循环将不再运行,并且该文件的IntentService将停止,但现在如果互联网返回,下载将从队列中的下一个文件开始,忽略最后一个文件我们无法下载。如何清除IntentService队列或使IntentService队列从其离开的位置恢复下载。

回答

1

如何清除IntentService队列或使IntentService队列从其离开的位置恢复下载。

你真的不能做任何,据我所知。 IntentService使用的队列不会暴露给开发人员。

在这种情况下,创建自己的队列(例如,LinkedBlockingQueue),您自己的线程监视队列以及您自己的Service包装所有这些(并处理一旦队列清空,你可以拨打stopSelf()并退出后台线程)。

或者,通过IntentService通知某些事件(例如,通过Messenger)关于失败的下载,因此您可以在Internet访问返回后的某个时间排队该文件。

+0

感谢您的回答。你可以给我一个链接到IntentService在Android平台上的实现,因为我似乎无法在任何地方找到它! – bytebiscuit

+0

http://www.google.com/codesearch#cZwlSNS7aEw/frameworks/base/core/java/android/app/IntentService.java – CommonsWare

+0

所以我打算在这里,这LinkedBlockQueue将包含线程和这个队列将被控制一个'最高'的线程,所有这些都包含在服务类中。所以现在如果我有10个文件,我需要启动存储在这个队列中的10个线程,并且控制是最高线程将按顺序运行。如果一个线程检测到互联网关闭,最高线程将被通知,并且最高线程将使用SharedPreferences记录下载的文件并自行终止并清除队列。 – bytebiscuit