6

私はアンドロイドの初心者で、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 に答える