2013-02-21 9 views
6

Sono un noob per Android e sto riscontrando problemi nell'aggiornare un appwidget. È un widget di notizie che visualizza testo diverso ogni 20 secondi. Non ho problemi a visualizzare correttamente il testo per lo & quando il widget è inizializzato. Tuttavia, dopo ogni aggiornamento di 30 minuti del widget, il mio widgetID int array mantiene l'int esistente prima dell'aggiornamento. Quindi dopo ogni aggiornamento il widget mostra vecchi dati e nuovi dati. Esiste una soluzione per cancellare l'array ID int dei vecchi dati durante il processo di aggiornamento. Qualsiasi aiuto è molto apprezzato.Come aggiorno correttamente AppWidget?

My Code:

allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); 

Metodo per la commutazione testo in gadget. Questo funziona bene inizialmente, ma dopo l'aggiornamento mostra i vecchi dati insieme con i nuovi dati ...

public void updateStory() { 

    tickerheadline = RssReader.rssheadline.get(storyCounter); 
    tickerstory = RssReader.rssstory.get(storyCounter); 
    remoteViews.setTextViewText(R.id.headline, tickerheadline); 
    remoteViews.setTextViewText(R.id.story, tickerstory); 
    if (storyCounter==RssReader.rssheadline.size()-1){ 
     storyCounter = 0; 
     storyCounter++; 
    }else{ 
     storyCounter++; 
    } 
    appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); 
    //Log.e("Widget", allWidgetIds.toString()); 
    mHandler.postDelayed(new Runnable() { 
     public void run() { 
      updateStory(); 
     } } ,20000); } 

} 

EDIT

public void updateStory() { 
    //Added 
    appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext()); 
    ComponentName thisWidget = new ComponentName(getApplicationContext(),MyWidgetProvider.class); 
    remoteViews = new RemoteViews(this.getApplicationContext().getPackageName(),R.layout.widget1);  


    tickerheadline = RssReader.rssheadline.get(storyCounter); 
    tickerstory = RssReader.rssstory.get(storyCounter); 
    remoteViews.setTextViewText(R.id.headline, tickerheadline); 
    remoteViews.setTextViewText(R.id.story, tickerstory); 
    if (storyCounter==RssReader.rssheadline.size()-1){ 
     storyCounter = 0; 
     storyCounter++; 
    }else{ 
     storyCounter++; 
    } 



    appWidgetManager.updateAppWidget(thisWidget, remoteViews); 

    //appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); 
    //Log.e("Widget", allWidgetIds.toString()); 
    mHandler.postDelayed(new Runnable() { 
     public void run() { 
      updateStory(); 
     } } ,20000); } 

} 
+0

forse se si imposta else {storyCounter ++; } a storyConter = 0; farà il trucco. – k0sh

+0

Grazie per la risposta. Come impedirebbe la visualizzazione dei dati del widgetid precedente? –

+0

Non ho mai lavorato con i widget prima, ma lavoro molto con le bitmap. e quando voglio resettare certe bitmap chiamerò bmp = null; non sono sicuro di cosa stai cercando di fare lassù. ma tu chiami storyCounter ++; quando storyCounter = 0; e nella tua altra dichiarazione. il che significa che hai eliminato la tua storyCounter = 0; e poi hai chiamato storyCounter ++; Perché dovresti farlo ? logicamente nella tua dichiarazione if else devi fare cose diverse ma nel tuo stai facendo la stessa cosa due volte. – k0sh

risposta

1

Anche se si può essere molto intelligente con AppWidgets in Android in termini di aggiornamento e così in , il modo più semplice per iniziare è semplicemente ricostruire il contenuto del widget ogni volta che si aggiorna. Poiché stai aggiornando solo ogni 30 minuti, non ci sono molti motivi per preoccuparti dell'utilizzo della CPU.

Quindi, suggerirei di eseguire una ricostruzione standard ogni volta che si attiva un aggiornamento utilizzando l'approccio standard. Il codice che hai sopra, anche se sembra corretto, in realtà non impone un aggiornamento, molto più pulito per iniziare da zero. Una volta che funziona, quindi se puoi renderlo più leggero, dimmi come!

// You need to provide: 
// myContext - the Context it is being run in. 
// R.layout.widget - the xml layout of the widget 
// All the content to put in it (duh!) 
// Widget.class - the class for the widget 

RemoteViews rv= new RemoteViews(myContext.getPackageName(), R.layout.widget); 
rv.setXXXXXXX // as per normal using most recent data set. 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(myContext); 
// If you know the App Widget Id use this: 
appWidgetManager.updateAppWidget(appWidgetId, rv); 
// Or to update all your widgets with the same contents: 
ComponentName projectWidget = new ComponentName(myContext, Widget.class); 
appWidgetManager.updateAppWidget(projectWidget, rv); 

Spesso l'approccio più semplice (a mio parere) è quello di avvolgere questo in un WidgetUpdater.class che sia chiama da un servizio o direttamente utilizzando una chiamata di allarme di tempo. L'uso di onUpdate è in genere una cattiva idea perché obbliga il telefono alla modalità piena potenza e non è molto controllabile. Non sono mai riuscito a farlo funzionare. Molto meglio fare qualcosa del tipo:

Intent myIntent = // As per your onUpdate Code 
    alarmPendingIntent = PendingIntent.getService(context, 0, myIntent, PendingIntent.FLAG_ONE_SHOT); 

    // ... using the alarm manager mechanism. 
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, nextUpdateTimeMillis, alarmPendingIntent); 
+0

Grazie per i suggerimenti. Ho già aggiornato il mio widget nel metodo onUpdate della classe del mio provider di widget. Si prega di controllare la mia modifica e vedere se sto gestendo correttamente. –

+0

Ho esteso la risposta per cercare di chiarire perché sto proponendo un approccio diverso - Se non è ancora chiaro, per favore dì. –

+0

Hai ordinato ora? –

Problemi correlati