android – 使用LinkedBlockingQueue实现IntentService?

android – 使用LinkedBlockingQueue实现IntentService?,第1张

概述我正在尝试使用IntentService下载多个文件. IntentService按预期的方式逐个加载它们,唯一的问题是当Internet关闭时,意图服务不会停止下载,而是会卡在当前线程上.如果我设法停止当前线程,它将继续运行存储在其队列中的其他线程,即使互联网连接已关闭. 在另一篇文章中建议我使用LinkedBlockingQueue并创建我自己的Worker线程,该线程不断检查此队列中的新线程 我正在尝试使用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();}@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?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1135390.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存