1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Controle de Downloads usando Semáforos com Prioridades Diferentes

Bom dia pessoal,

preciso implementar uma classe para o controle de downloads usando semáforos. Na minha aplicação eu possuo dois tipos diferentes de arquivos vídeo e áudio para download. No entanto eu preciso definir prioridades para esses dois tipos de arquivos. Os arquivos de vídeo tem prioridade sobre os de áudio, no entanto eu preciso balancear a baixa destes arquivos. Estava pensando eu criar dois semáforos, para cada tipo de arquivo, e controlar o uso dos semáforos com um contador. Um exemplo seria a cada 3 arquivos de vídeo baixado eu baixaria um de áudio.

Acredito que exista uma forma mais elegante de resolver esse problema alguém tem alguma sugestão ?

Segue a classe que eu criei utilizando um semáforo para os dois tipos de arquivos.

public MyDownloader extends Thread {

    private static final Semaphore downloaderAvailable = new Semaphore(Config.MAX_CONCURRENT_DOWNLOADS, true);

    private static ArrayList<String> currentDownloads = new ArrayList<String>();

    private String fileName;

    private int fileType;

    private String urlRemote

    public MyDownloader(String fileName, int fileType, String urlRemote){
        this.fileName = fileName;
        this.fileType = fileType;
        this.urlRemote = urlRemote;

    }

    public void run(){


        /**
         *    Verifica se o arquivo a ser baixado já existe na lista
         *    de downloads em execução.
         */
        if(currentDownloads.contains(fileName))
            return;

        /**
         *    Verifica se o número de Threads aguardando o semáforo é maior ou igual a 10 vezes o
         *     número de downloads concorrentes. Caso seja, encerra essa thread criada evitando assim
         *    que um número muito grande de threads sejam criadas e fiquem aguardando a liberação do
         *    semáforo.
         */
        if(downloaderAvailable.getQueueLength() >= Config.MAX_CONCURRENT_DOWNLOADS * 10)
            return;

        try{
            currentDownloads.add(fileName);

            /**
             * Pede um recurso de download ao semáforo
             */
            downloaderAvailable.acquire();

            /**
             * Realiza o download do arquivo após a
             * liberação do semáforo
             */
            FileDownloader fd = new FileDownloader();
            InputStream inputStream = fd.download(urlRemote);


        }catch(InterruptedException e){
            Log.e(TAG, "InterruptedException");
        }catch(IOException e){
            Log.e(TAG, "IOException");
        }finally{
            currentDownloads.remove(fileName);
            downloaderAvailable.release();
        }
    }
}
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags android download threads ou faça a sua própria pergunta.