2013-02-21 19 views
6

Jestem noobem dla Androida i mam problemy z aktualizacją aplikacji. Jest to widget wiadomości wyświetlający inny tekst co 20 sekund. Nie mam problemu z wyświetleniem tekstu, aby prawidłowo przełączać wyświetlanie & po inicjalizacji widgetu. Jednak po każdych 30 minutach aktualizacji widżetu moja tablica widgetID int zachowuje int, który istniał przed aktualizacją. Po każdej aktualizacji widget wyświetla stare dane i nowe dane. Czy istnieje wyczyszczenie tablicy ID widgetu starych danych podczas procesu aktualizacji. Każda pomoc jest bardzo doceniana.Jak prawidłowo zaktualizować aplikację AppWidget?

mój kod:

allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); 

Metoda przełączania tekstu w widgecie. Działa to dobrze na początku, ale po aktualizacji pokazuje stare dane wraz z nowymi danymi ...

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

może, jeśli ustawisz else {storyCounter ++; } to storyConter = 0; da rade. – k0sh

+0

Dzięki za odpowiedź. W jaki sposób zapobiegnie to wyświetlaniu danych poprzedniego widgetID? –

+0

Nigdy wcześniej nie pracowałem z widżetami, ale pracuję z bitmapami. i kiedy chcę zresetować pewną bitmapę, zadzwonię do bmp = null; nie jestem pewien, co próbujesz tam zrobić. ale ty dzwonisz do storyCounter ++; gdy storyCounter = 0; i w twoim innym oświadczeniu. co oznacza, że ​​wyczyściłeś swoją historięCounter = 0; a następnie nazwałeś storyCounter ++; dlaczego chcesz to zrobić ? logicznie w swojej instrukcji if else musisz robić różne rzeczy, ale w twoim przypadku robisz to samo dwa razy. – k0sh

Odpowiedz

1

Chociaż można być bardzo mądry z AppWidgets Android w zakresie aktualizacji i tak w , najprostszym sposobem na rozpoczęcie pracy jest po prostu odbudowanie zawartości widżetów przy każdym odświeżeniu. Ponieważ odświeżasz je co 30 minut, nie ma powodu, by martwić się o użycie procesora.

Proponuję wykonanie standardowej przebudowy za każdym razem, gdy uruchamiasz aktualizację przy użyciu standardowego podejścia. Kod, który masz powyżej, chociaż wygląda poprawnie, w rzeczywistości nie wymusza aktualizacji, o wiele czystsze, aby zacząć od zera. Kiedy to działa, to jeśli chcesz, aby był bardziej lekki, powiedz mi, jak!

// 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); 

Często najprostszy podejście (moim zdaniem) jest to owinąć się w WidgetUpdater.class które albo dzwonić z serwisu lub bezpośrednio za pomocą wywołania alarmu czasu. Używanie funkcji onUpdate jest generalnie złym pomysłem, ponieważ zmusza telefon do trybu pełnej mocy i nie można go łatwo kontrolować. Nigdy nie udało mi się sprawić, żeby to działało. Znacznie lepiej zrobić coś takiego:

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

Dzięki za sugestie. Już aktualizuję mój widget w metodzie onUpdate mojej klasy dostawcy widgetu. Sprawdź moją edycję i zobacz, czy operuję nią poprawnie. –

+0

Poszerzyłem odpowiedź, aby spróbować wyjaśnić, dlaczego proponuję inne podejście - jeśli nadal nie jest jasne, powiedz. –

+0

Czy masz już to posortowane? –