Autore Topic: Migliore Soluzione Per Download  (Letto 692 volte)

Offline phabdev

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note 2
  • Sistema operativo:
    Ubuntu 12.04
Migliore Soluzione Per Download
« il: 04 Settembre 2014, 16:31:44 CEST »
0
Ciao a tutti.

Vorrei implementare un meccanismo di download nella mia applicazione.

Preferirei strutturarlo in modo da ottenere un modulo a cui viene delegato il compito del download e che, in qualche modo, abbia la possibilità di notificare diversi componenti del cambio di stato del download.
Mi servirebbe specialmente per poter accedere alle informazioni del download da più viste.
Gli stati sono (userò uno pseudo linguaggio ad alto livello per capirci meglio): inConnessione(), inDownload(progresso), inErrore(codice), finito().
Bisogna anche differenziare i download. Si potrebbero anche identificare per url.

Inizialmente avevo pensato di delegare la funzione di download (quindi la connessione) ad un Service utilizzando un BroadcastReceiver per gestire gli stati.

Il BroadcastReceiver conosce chi lo "osserva" in modo da poterli notificare dei cambiamenti passati dal service.. e fin qui tutto ok.
Quello che non riesco a fare bene e "manipolare" il download... ossia poter dire al service di annullare il download una volta avviato.

Dato che sto avendo l'impressione di metterci troppo tempo, volevo chiedervi una "best practice" per gestire, in sostanza, dei download con un approccio da "mvc".

Grazie.

Fabrizio.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Migliore Soluzione Per Download
« Risposta #1 il: 04 Settembre 2014, 17:12:14 CEST »
+1
Penso che prima di tutto dovresti usare una libreria tipo okhttp. Perché si occupa in totale del download, incluse le funzioni (forse non tutte) che to servono.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline phabdev

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note 2
  • Sistema operativo:
    Ubuntu 12.04
Re:Migliore Soluzione Per Download
« Risposta #2 il: 04 Settembre 2014, 17:51:26 CEST »
0
Sì grazie... in effetti non l'ho precisato ma io parlavo più a livello architetturale.

Il problema è delegare ad un componente un certo task con progresso e mettere in piedi una struttura che permette di comunicare lo stato del task ed il progresso.
Quindi gli eventi di annullamento, avanzamento, fine (con codice).

Potrebbe essere anche il caricamento dei secondi.. La cosa che mi blocca un po' è come gestire l'accesso al task da componenti di cui non sappiamo esattamente chi siano a priori... ma abbiamo un'interfaccia di mezzo.

Volevo usare un approccio in stile observer ma non so se sia la soluzione migliore.. anche perché sembrerebbe essere troppo macchinoso..
O forse mi sfugge qualcosa ;)

Che dite?

iClaude

  • Visitatore
Re:Migliore Soluzione Per Download
« Risposta #3 il: 04 Settembre 2014, 18:13:54 CEST »
0
Sì grazie... in effetti non l'ho precisato ma io parlavo più a livello architetturale.

Il problema è delegare ad un componente un certo task con progresso e mettere in piedi una struttura che permette di comunicare lo stato del task ed il progresso.
Quindi gli eventi di annullamento, avanzamento, fine (con codice).

Potrebbe essere anche il caricamento dei secondi.. La cosa che mi blocca un po' è come gestire l'accesso al task da componenti di cui non sappiamo esattamente chi siano a priori... ma abbiamo un'interfaccia di mezzo.

Volevo usare un approccio in stile observer ma non so se sia la soluzione migliore.. anche perché sembrerebbe essere troppo macchinoso..
O forse mi sfugge qualcosa ;)

Che dite?

La frase in grassetto non l'ho capita...
Cmq usando un "binding Service" hai la possibilità di gestire comodamente la comunicazione:
- dai tuoi componenti al Service: sfruttando semplicemente il reference del Service
- dal Service ai tuoi componenti: basta creare un'interfaccia nel Service da far implementare da ogni componente che si deve collegare

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Migliore Soluzione Per Download
« Risposta #4 il: 04 Settembre 2014, 18:16:09 CEST »
0
Non ho mai fatto una cosa del genere, ma prendi anche in considerazione un'interfacciamento tra service e activity (ma anche altre apps) usando un Content Provider.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline phabdev

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note 2
  • Sistema operativo:
    Ubuntu 12.04
Re:Migliore Soluzione Per Download
« Risposta #5 il: 04 Settembre 2014, 18:44:11 CEST »
0
La frase in grassetto non l'ho capita...
Cmq usando un "binding Service" hai la possibilità di gestire comodamente la comunicazione:
- dai tuoi componenti al Service: sfruttando semplicemente il reference del Service
- dal Service ai tuoi componenti: basta creare un'interfaccia nel Service da far implementare da ogni componente che si deve collegare
Sì in pratica era quello che volevo intendere.
Solo che dal service dovrei "notificare" i componenti che implementano l'interfaccia... ed è lì che mi viene difficile...
Non posso istanziare un service e manipolandolo attaccandogli dei componenti da notificare.
L'altra soluzione sarebbe fare un "polling" al service tramite interfacce... ma vorrei tenerla come ultima soluzione.

Provo a fare un esempio

Service
Codice (Java): [Seleziona]
public class DownloadService extends IntentService {

  private LinkedList<DownloadObserver> observers;
 
  public DownloadService(){
    observers = new LinkedList<DownloadObserver>();
  }

  public void attachObserver(DownloadObserver o){
    observers.add(o);
  }

  private void notifyProgress(int progress){
    for(DownloadObserver o:observers){
      o.updateProgress(progress);
    }
  }

  private void doDownload(String url){
   //..
  }
}

Client
Codice (Java): [Seleziona]
//..

Intent intent = new Intent(ctx, DownloadService.class);
startService(intent);

//..

In questo caso mi perdo il linking tra Service e Client.

Non so se mi spiego..

iClaude

  • Visitatore
Re:Migliore Soluzione Per Download
« Risposta #6 il: 04 Settembre 2014, 18:56:45 CEST »
+1
Usare un IntentService non è molto indicato perchè si tratta di uno "starting Service", quindi la comunicazione Service-->Componenti avviene tipicamente tramite broadcast. Inoltre l'IntentService esegue le richieste una alla volta in ordine sequenziale.
Nel tuo caso utilizzeri invece un "binding Service".
Va bene invece la tua idea di memorizzare in una lista i vari componenti collegati al Service.
Prova a vedere questa guida (però in inglese) e le 2 precedenti e integrala con la lista:
Android - The Technical Blog: Binding Services – part 3 (communication Service -&gt; Activity)

Offline phabdev

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note 2
  • Sistema operativo:
    Ubuntu 12.04
Re:Migliore Soluzione Per Download
« Risposta #7 il: 05 Settembre 2014, 10:39:21 CEST »
0
Usare un IntentService non è molto indicato perchè si tratta di uno "starting Service", quindi la comunicazione Service-->Componenti avviene tipicamente tramite broadcast. Inoltre l'IntentService esegue le richieste una alla volta in ordine sequenziale.
Nel tuo caso utilizzeri invece un "binding Service".
Va bene invece la tua idea di memorizzare in una lista i vari componenti collegati al Service.
Prova a vedere questa guida (però in inglese) e le 2 precedenti e integrala con la lista:
Android - The Technical Blog: Binding Services – part 3 (communication Service -&gt; Activity)

Grazie! Sembrerebbe quello che fa a caso mio.
Provo ad adattarlo e vi faccio sapere ;)

Ciao!

Offline phabdev

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note 2
  • Sistema operativo:
    Ubuntu 12.04
Re:Migliore Soluzione Per Download
« Risposta #8 il: 09 Settembre 2014, 11:48:26 CEST »
0
Grazie ragazzi.
Alla fine ho fatto grosso modo questo:
Il service usa un asynctask per gestire il (unico) download.
ha le informazioni associate al download in corso (quindi nome e stato).
Al progresso e alla fine (sia con esito positivo che con esito negativo) il service notifica gli observer che ha in lista associati al download in corso.
Il service offre un metodo per l'annullamento del download e per avere informazioni sullo stato attuale del download.
Ogni volta che un componente dedicato ad un download viene creato si "attacca" al service con il nome del download di cui si occupa.
In questo modo il service notificherà solo i client aventi il nome del download che è in corso.
Ho implementato il service con i client usando il binding service più o meno come descritto nel link che ha postato iClaude.
E' stato molto utile avendo la possibilità di avere accesso all'istanza del service ed utilizzarla come oggetto (e di conseguenza i suoi metodi).

Ora riesco a manipolare ed osservare i download. Se avete qualche suggerimento per renderlo migliore ovviamente sono tutte orecchie :D

Ciao.
« Ultima modifica: 09 Settembre 2014, 11:50:05 CEST da phabdev »

Offline lillogoal

  • Utente normale
  • ***
  • Post: 167
  • Respect: +4
    • Google+
    • lillosogliani
    • Mostra profilo
    • LilloNet
  • Dispositivo Android:
    Galaxy s3, Nexus 7,galaxy s advance,galaxy scl
  • Play Store ID:
    Lillonet Inc.
  • Sistema operativo:
    Windows 8,7 & Kali-Linux
Re:Migliore Soluzione Per Download
« Risposta #9 il: 09 Settembre 2014, 15:42:34 CEST »
0
Sto seguendo questa discussione da un po' di giorni e mi chiedevo: come è possibile gestire una listview con più download simultanei?
Vi ringrazio in anticipo
Chi non progetta la sicurezza , programma il fallimento! K.M