我正在尝试使用IntentService下载多个文件. IntentService按预期的方式逐个加载它们,唯一的问题是当Internet关闭时,意图服务不会停止下载,而是会卡在当前线程上.如果我设法停止当前线程,它将继续运行存储在其队列中的其他线程,即使互联网连接已关闭.
在另一篇文章中建议我使用LinkedBlockingQueue并创建我自己的Worker线程,该线程不断检查此队列中的新线程.现在我知道在创建和销毁线程时会有一些增加的开销和性能问题但在我的情况下这不是一个问题.
在这一点上,我想要做的就是理解IntentService是如何工作的,但是我没有(我已经查看了代码),然后使用由Worker线程控制的LinkedBlockingQueue为它提出了我自己的实现.有没有人这样做过?可以提供一个工作示例,如果您觉得提供源代码感觉不舒服,我可以使用伪代码.谢谢!
更新:我最终使用一个带有looper的线程实现了我自己的Intent Service,该looper检查队列,队列又存储从startService(intent)传递的意图.
public class MyIntentService extends Service { private BlockingQueue<Download> queue = new LinkedBlockingQueue<Download>(); public MyIntentService(){ super(); } @Override public void onCreate() { super.onCreate(); new Thread(queueController).start(); Log.e("onCreate","onCreate is running again"); } boolean killed = false; Runnable queueController = new Runnable() { public void run() { while (true) { try { Download d =queue.take(); if (killed) { break; } else { d.downloadFile(); Log.e("QueueInfo","queue size: " + queue.size()); } } catch (InterruptedException e) { break; } } Log.e("queueController","queueController has finished processing"); Log.e("QueueInfo","queue size: " + queue.toString()); } }; class Download { String name; //Download files process void downloadFile() { //Download code here } Log.e("Download","Download being processed is: " + name); } public void setName(String n){ name = n; } public String getName(){ return name; } } public void killService(){ killed = true; } @Override public int onStartCommand(Intent intent,int flags,int startId) { Download d = new Download(); d.setName(intent.getStringExtra("VIDEOS")); queue.add(d); return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); Log.e("stopSelf","stopSelf has been just called to stop the Service"); stopSelf(); } @Override public IBinder onBind(Intent intent) { return null; } }
我对onStartCommand()方法中的START_NOT_STICKY不太确定.如果它是正确的标志返回.任何澄清,将不胜感激!
解决方法
更新:我最终使用一个带有looper的线程实现了我自己的Intent Service,队列又存储从startService(intent)传递的意图.
公共类MyIntentService扩展Service {
private BlockingQueue<Download> queue = new LinkedBlockingQueue<Download>(); public MyIntentService(){ super(); } @Override public void onCreate() { super.onCreate(); new Thread(queueController).start(); Log.e("onCreate","onCreate is running again"); } boolean killed = false; Runnable queueController = new Runnable() { public void run() { while (true) { try { Download d =queue.take(); if (killed) { break; } else { d.downloadFile(); Log.e("QueueInfo","queue size: " + queue.size()); } } catch (InterruptedException e) { break; } } Log.e("queueController","queueController has finished processing"); Log.e("QueueInfo","queue size: " + queue.toString()); } }; class Download { String name; //Download files process void downloadFile() { //Download code here } Log.e("Download","Download being processed is: " + name); } public void setName(String n){ name = n; }