Autore Topic: Widget su ICS  (Letto 1445 volte)

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Widget su ICS
« il: 11 Aprile 2012, 10:55:39 CEST »
0
Qualcuno sa se è cambiata la gestione dei widget con android 4?
Ho creato un widget che tramite un service si aggiorna ogni 30 minuti scaricando tramite webservice alcune informazioni, su android 3 funziona perfettamente mentre su ICS da errore di Timeout, ma credo che il problema sia un altro perché l'errore è immediato.
è stato creato come i vari tutorial che si trovano in rete ma su ics non si aggiorna mi da sempre errore.

Idee o esperienze?
Grazie


Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:Widget su ICS
« Risposta #1 il: 11 Aprile 2012, 13:47:52 CEST »
0
Per caso lanci una connessione http sul main thread? In ICS questo manda il tutto ad esplodere immediatamente.

Per il resto i widget non sono cambiati poi molto, a parte la gestione automatica del padding e qualche nuova feature.

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Widget su ICS
« Risposta #2 il: 11 Aprile 2012, 14:43:13 CEST »
0
si lancio una connessione http ma la faccio dal service non dovrebbe essere già lui stesso un thread separato dal main thread.
Dici che sia quello?
quindi dovrei creare un thread dal service che esegue la richiesta al web service?

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:Widget su ICS
« Risposta #3 il: 11 Aprile 2012, 14:46:32 CEST »
0
Il Service gira sullo stesso thread della GUI a meno che tu non lanci un thread secondario dal Service  :-)

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Widget su ICS
« Risposta #4 il: 12 Aprile 2012, 08:54:08 CEST »
0
Ho provato in tutti in tutti i modi con un asyncTask ma non riesco a farlo funzionare. Oltre a essere complicato non so da dove lanciarlo.
Dal service  o dal Widget? e una volta lanciato come faccio ad aggiornare la ui?
Manca il context, la remoteview e anche le resource.

Proverò ad eliminare il service e a lanciare un thread dal widget direttamente.

Se qualcuno trova qualche esempio funzionante ....

Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:Widget su ICS
« Risposta #5 il: 12 Aprile 2012, 09:18:48 CEST »
0
Citazione
Oltre a essere complicato non so da dove lanciarlo.
Dal service  o dal Widget?
Se aggiorni il widget dal service, direi dal service.

Complicato non direi, ti basta implementare il metodo doInBackground() e spostare lì il codice che normalmente gira sul thread principale. Ogni operazione sulla GUI va fatta invece nell'onPostExecute(). Dopodichè istanzi un nuovo oggetto della tua classe che estende AsyncTask e lanci il suo execute().

Citazione
Manca il context, la remoteview e anche le resource.
Context e resources le recuperi facilmente se la tua classe che estende AsyncTask è innestata nel Service (puoi accedere a tutti i suoi membri). La remoteview la devi recuperare "a mano" anche dal Service, quindi non cambia nulla.

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Widget su ICS
« Risposta #6 il: 12 Aprile 2012, 09:36:51 CEST »
0
è esattamente quello che ho fatto, ma non funziona il codice si ferma sulla riga execute dell task ma non esegue altro senza dare alcun errore.
oltre al fatto che dal metodo onPostExecute non  ho i riferimenti alla context alla remoteview e tanto meno a getResource non c'è modo di recuperarli, l'unica cosa possibile e mettere delle variabili a livello di classe e istanziarle prima di chiamare il task per averli disponibili su metodo, ma non so se è corretto.

Appena posso posto il codice .


Offline DarnellNajanReed

  • Utente normale
  • ***
  • Post: 359
  • Respect: +49
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One, Acer Iconia A500/501, Asus Transformer Prime, Galaxy ACE, Galaxy S Plus, Galaxy S Advance P, Galaxy Tab 2 7.0, Google Nexus 7
  • Play Store ID:
    Luigi Notaro
  • Sistema operativo:
    OS X 10.8.3
Re:Widget su ICS
« Risposta #7 il: 12 Aprile 2012, 09:48:27 CEST »
0
Il context è il Service.

E la remoteview la devi comunque recuperare dal Service se fai l'aggiornamento da lì, passando al costruttore il package e la view da recuperare...

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Widget su ICS
« Risposta #8 il: 12 Aprile 2012, 11:10:25 CEST »
0
Ottimo, ti ringrazio per la tua disponibilità e per la  delucidazione non avevo provato la notazione MiaClasse.Service.this per il context ora è più chiaro.
Mi rimane un altro dubbio !
Immagino che il task debba essere lanciato sul onStartCommand del service, ma poi quando richiamare il metodo per aggiornare la ui del widget  con il metodo updateAppWidget e come recupero l'identificatore del widget ?

updateAppWidget deve essere chiamato dal onPostExecute o in onStartCommand

Grazie

Offline ignaz

  • Utente junior
  • **
  • Post: 54
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Galaxy s2
  • Sistema operativo:
    Win 7 64bit
Re:Widget su ICS
« Risposta #9 il: 13 Aprile 2012, 09:46:26 CEST »
0
Aggiornamento:
Sono riuscito a farlo funzionare utilizzando un AsynkTask per eseguire una chiamata SOAP e aggiornarte il widget
Codice (Java): [Seleziona]
/**
                 * AsynkTask per aggiornare l'interfaccia del Widget contenuta all'interno della classe Service
                 * Avviato dal widget
                 * Esegue una choiamata Soap e aggiorna l'interfaccia del Widget
                 * @author bolognini
                 *
                 */

                 public class ServiveTaskasynk extends AsyncTask<Context, String, Entitymeteo> {
               
                                               
                                @Override
                                protected Entitymeteo doInBackground(Context... params) {
                                        // TODO Auto-generated method stub
                                        // Richiamo il webservice su unn nuovo Thread
                                        Entitymeteo valori = WebserviceClient.GetDatiMeteo(params[0]);                                 
                                        return valori;
                                }
                               
                               
                                @Override
                                protected void onProgressUpdate(String... progress) {
                                    // line below coupled with
                                    // Non devo notificare nulla
                                }
                               
                                 @Override
                                  protected void onPostExecute(Entitymeteo valori) {
                                   // TODO Auto-generated method stub
                                   // Aggiorna l'interfaccia tramite Remoteview
                                         RemoteViews views = new RemoteViews(Widget.WindRefreshService.this.getPackageName(),R.layout.widget);
                                         try {
                                                        if (valori == null)
                                                                throw new NullPointerException();
                                                        // Entitymeteo valori = WebserviceClient.GetDatiMeteo(context);
                                                        views.setTextViewText(R.id.txt_Direzione, valori.Direzione);
                                                        views.setTextViewText(R.id.txt_DirezioneVento,
                                                                        WebserviceClient.Direzione(valori.Direzione));
                                                        .......

                                                } catch (NullPointerException err) {
                                                        views.setTextViewText(R.id.txt_data, err.getMessage());
                                                        views.setTextViewText(R.id.txt_Direzione, "---");
                                                        views.setTextViewText(R.id.txt_Intensita,
                                                                        Widget.WindRefreshService.this.getString(R.string.lab_nodata));
                                                        views.setTextViewText(R.id.txt_raffica,
                                                                        Widget.WindRefreshService.this.getString(R.string.lab_nodata));
                                                        views.setTextViewText(R.id.txt_temp,
                                                                        Widget.WindRefreshService.this.getString(R.string.lab_nodata));
                                                        views.setTextViewText(R.id.txt_idc,
                                                                        Widget.WindRefreshService.this.getString(R.string.lab_nodata));
                                                        views.setTextViewText(R.id.txt_umidita,
                                                                        Widget.WindRefreshService.this.getString(R.string.lab_nodata));
                                                        throw err;

                                                }
                                               
                                                                               
                                                //assegna al container del widjet  l'intent per aprire la form
                                                Intent in = new Intent(getBaseContext(), ViewPagerFragmentActivity.class);
                                                in.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
                                                PendingIntent pi = PendingIntent.getActivity(getBaseContext(),1, in, 0);
                                                views.setOnClickPendingIntent(R.id.layautContainer, pi);
                                                // Otteniamo il riferimento al Manager
                                                AppWidgetManager manager = AppWidgetManager.getInstance(Widget.WindRefreshService.this);
                                                // Aggiorniamo tutti i corrispondenti valori    del widjet                                     
                                                manager.updateAppWidget(mAppWidgetId, views);  
               
                                  }
               
                        }

Avvio l'asynkTask dall' onStartCommand del serizio.

Codice (Java): [Seleziona]
new ServiveTaskasynk().execute(new Context[]{Widget.WindRefreshService.this});