6

我是 android 的菜鸟,我在更新 appwidget 时遇到问题。这是一个新闻小部件,每 20 秒显示不同的文本。初始化小部件时,让文本正确切换和显示没有问题。但是,每 30 分钟更新一次小部件后,我的 widgetID int 数组会保留更新之前存在的 int。因此,每次更新后,小部件都会显示旧数据和新数据。在更新过程中是否有清除旧数据的小部件 ID int 数组。任何帮助是极大的赞赏。

我的代码:

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

}

编辑

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

}
4

1 回答 1

1

尽管在更新等方面您可以非常聪明地使用 android 中的 AppWidgets,但最简单的方法是每次刷新时重新构建小部件内容。由于您仅每 30 分钟刷新一次,因此没有太多理由担心 CPU 使用率。

因此,我建议每次使用标准方法触发更新时进行标准重建。您上面的代码虽然看起来正确,但实际上并不强制更新,从头开始更干净。一旦它起作用了,那么如果你能让它更轻量级,请告诉我如何!

// 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);
于 2013-02-21T16:43:32.663 回答