2013-02-21 3 views
6

Я обоюдный андроид, и у меня проблемы с обновлением appwidget. Это новостной виджет, который отображает разный текст каждые 20 секунд. У меня нет проблем с получением текста для правильного отображения &, когда виджет инициализируется. Однако после каждых 30 минут обновления виджета мой массив widgetID int сохраняет int, существовавший до обновления. Поэтому после каждого обновления виджет показывает старые данные и новые данные. Есть ли, чтобы очистить массив идентификаторов виджета старых данных во время процесса обновления. Любая помощь приветствуется.Как правильно обновить AppWidget?

Мой код:

allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); 

Способ переключения текста в виджете. Это отлично работает на начальном этапе, но после обновления показывает старые данные наряду с новыми данными ...

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

возможно, если вы установите else {storyCounter ++; } to storyConter = 0; будет делать трюк. – k0sh

+0

Спасибо, что ответили. Как это предотвратит отображение данных предыдущего виджета? –

+0

Я никогда раньше не работал с виджетами, но я часто работаю с растровыми изображениями. и когда я хочу сбросить некоторые растровые изображения, я назову bmp = null; Я не уверен, что вы пытаетесь сделать там. но вы вызываете storyCounter ++; когда storyCounter = 0; и в вашем другом заявлении. что означает, что вы очистили свою историюCounter = 0; а затем вы назвали storyCounter ++; Почему ты бы так поступил ? логически в вашем случае if else вы должны делать разные вещи, но в вашем случае вы делаете то же самое дважды. – k0sh

ответ

1

Хотя вы можете быть очень умными с AppWidgets в андроиде с точки зрения обновления и так в , самый простой способ - просто восстановить содержимое виджета каждый раз, когда вы обновляете. Поскольку вы только освежаете каждые 30 минут, нет никаких оснований беспокоиться об использовании процессора.

Итак, я предлагаю выполнить стандартную перестройку при каждом запуске обновления с использованием стандартного подхода. Код, который у вас есть выше, хотя он выглядит правильно, на самом деле не заставляет обновлять, гораздо чище начинать с нуля. Как только это сработает, тогда, если вы сделаете его более легким, скажите мне, как это сделать!

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

Часто самый простой подход (на мой взгляд), чтобы обернуть это в WidgetUpdater.class который вы либо позвонить из службы или непосредственно с помощью вызова будильника времени. Использование onUpdate - это, как правило, плохая идея, поскольку она заставляет телефон работать в режиме полной мощности и не очень контролируема. Мне никогда не удавалось заставить его работать. Гораздо лучше сделать что-то вроде:

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

Спасибо За ваши предложения. Я уже обновляю свой виджет в методе onUpdate моего класса поставщика виджетов. Проверьте мои изменения и посмотрите, правильно ли я их обрабатываю. –

+0

Я продлил ответ, чтобы попытаться выяснить, почему я предлагаю другой подход. Если еще не ясно, скажите. –

+0

У вас есть это отсортировано сейчас? –

Смежные вопросы