【问题标题】:Implementation of IntentService using LinkedBlockingQueue?使用 LinkedBlockingQueue 实现 IntentService?
【发布时间】:2012-03-30 02:45:24
【问题描述】:

我正在尝试使用 IntentService 下载多个文件。 IntentService 一次按预期下载它们,唯一的问题是当 Internet 关闭时,意图服务不会停止下载,而是会卡在当前线程上。如果我设法停止当前线程,即使互联网连接中断,它也会继续运行存储在其队列中的其他线程。

在另一篇文章中建议我使用 LinkedBlockingQueue 并创建自己的 Worker 线程,该线程不断检查此队列是否有新线程。现在我知道在创建和销毁线程时会增加一些开销,从而导致性能问题,但在我的情况下这不是问题。

此时,我要做的就是了解 IntentService 是如何工作的,但我还没有(我已经查看了代码),然后使用由 Worker 控制的 LinkedBlockingQueue 为它提出我自己的实现线。有没有人这样做过?可以提供一个工作示例,如果您对提供源代码感到不舒服,我可以使用伪代码。谢谢!

更新:我最终实现了我自己的 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。如果它是正确的标志返回与否。对此的任何澄清将不胜感激!

【问题讨论】:

  • 我在想,不是一个一个下载所有这些文件,而是压缩它们,然后下载一次zip文件,然后在下载完成时提取sd卡中的文件,这可能吗?

标签: android


【解决方案1】:

更新:我最终使用一个线程实现了我自己的 Intent Service,该线程有一个 looper,它检查队列,该队列又存储从 startService(intent) 传递的意图。

公共类 MyIntentService 扩展服务 {

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;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2013-06-08
    • 2010-11-28
    相关资源
    最近更新 更多