
在另一篇文章中建议我使用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();}@OverrIDepublic 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; } 总结 以上是内存溢出为你收集整理的android – 使用LinkedBlockingQueue实现IntentService?全部内容,希望文章能够帮你解决android – 使用LinkedBlockingQueue实现IntentService?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)