1

私はAndroidの初心者で、ヘッドラインとスニペットを30秒間表示するニュースウィジェットを作成しようとしています。その後、別の見出しとスニペットに変更します。ウィジェットにこれを連続ループで実行させたい。これまでのところ、最初の見出しとスニペットしか表示できませんでした。30秒ごとにalarmManagerを呼び出さずにテキストを変更するにはどうすればよいですか?どんな助けでも大歓迎です。

私のコード

public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {



    RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget1);


    String tickerheadline="testing";
    String tickerstory="testing";
    for (int i = 0; i < RssReader.rssheadline.size(); i++) {
        tickerheadline = RssReader.rssheadline.get(RssReader.rssheadline.size()-(i+1));
        tickerstory = RssReader.rssstory.get(RssReader.rssheadline.size()-(i+1));
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() { 
             public void run() {} 
            }, 30000);

    }

    updateViews.setTextViewText(R.id.headline, tickerheadline );
    updateViews.setTextViewText(R.id.story, tickerstory );

    appWidgetManager.updateAppWidget(appWidgetId, updateViews);
} 

編集

public static void updateAppWidget(final Context context, final AppWidgetManager appWidgetManager, final int appWidgetId) {
    final RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget1);

new Thread(new Runnable() {
        public void run() {     
    tickerheadline="testing";
    tickerstory="testing";
    for (int i = 0; i < RssReader.rssheadline.size(); i++) {
        tickerheadline = RssReader.rssheadline.get(RssReader.rssheadline.size()-(i+1));
        tickerstory = RssReader.rssstory.get(RssReader.rssheadline.size()-(i+1));
        context.runOnUiThread(action); //action cannot be resolved as variable
        SystemClock.sleep(30000);

    }
        }
    }).start();

    Runnable action = new Runnable() {
        public void run() {
    updateViews.setTextViewText(R.id.headline, tickerheadline );
    updateViews.setTextViewText(R.id.story, tickerstory );


    appWidgetManager.updateAppWidget(appWidgetId, updateViews);
        }
    };

} }
4

4 に答える 4

1

メソッドに渡す引数が何であれ、クラスのコンストラクターを作成してそれを渡すことができ、「MainActivity.this」を「context」に置き換えます。それでも疑問がある場合はお知らせください... :)

public void updateAppWidget(){
    new YourNewClass().start();
}
private class YourNewClass extends Thread {
    @Override
    public void run() {
        for(--,--,--){
            MainActivity.this.runOnUiThread(runnable);
            SystemClock.sleep(30000);
        }
    }
}
private Runnable  runnable = new Runnable() {
    public void run() {

    }
};
于 2012-12-07T21:43:52.743 に答える
0

これが問題を解決するためのアプローチであるかどうかはわかりません。とにかく、actionアクセスしたい後に宣言されているため、解決できません。次のように宣言してみてください。

public static void updateAppWidget(final Context context, final AppWidgetManager appWidgetManager, final int appWidgetId) {
    final RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget1);

    final Runnable action = new Runnable() {
        public void run() {
            updateViews.setTextViewText(R.id.headline, tickerheadline);
            updateViews.setTextViewText(R.id.story, tickerstory);

            appWidgetManager.updateAppWidget(appWidgetId, updateViews);
        }
    };

    new Thread(new Runnable() {
        public void run() {
            tickerheadline = "testing";
            tickerstory = "testing";
            for (int i = 0; i < RssReader.rssheadline.size(); i++) {
                tickerheadline = RssReader.rssheadline.get(RssReader.rssheadline.size() - (i + 1));
                tickerstory = RssReader.rssstory.get(RssReader.rssheadline.size() - (i + 1));
                context.runOnUiThread(action); //action cannot be resolved as variable
                SystemClock.sleep(30000);

            }
        }
    }).start();
}

また、ではなくrunOnUiThreadクラスのメソッドです。 http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable )ActivityContext

于 2012-12-17T14:34:21.680 に答える
0

コードは次のようになります。それがあなたを助けることを願っています...

public static void updateAppWidget(final Activity context, final AppWidgetManager appWidgetManager, final int appWidgetId) {
    final RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget1);

    new Thread(new Runnable() {
        public void run() {
            String tickerheadline="testing";
            String tickerstory="testing";
            for (int i = 0; i < RssReader.rssheadline.size(); i++) {
                tickerheadline = RssReader.rssheadline.get(RssReader.rssheadline.size()-(i+1));
                tickerstory = RssReader.rssstory.get(RssReader.rssheadline.size()-(i+1));

                context.runOnUiThread(action);
                SystemClock.sleep(30000);

//                  Handler handler = new Handler(); 
//                  handler.postDelayed(new Runnable() { 
//                       public void run() {} 
//                      }, 30000);

            }
        }
    }).start();

    Runnable action = new Runnable() {
        public void run() {
            updateViews.setTextViewText(R.id.headline, tickerheadline );
            updateViews.setTextViewText(R.id.story, tickerstory );
            appWidgetManager.updateAppWidget(appWidgetId, updateViews);
        }
    };

} 
于 2012-12-07T22:13:44.863 に答える
0

fwiw、あなたが提示したコードは、すべてのランナブルを同時に起動します(for ループが開始してから 30 秒)。

これは私が一般的に使用するパターンです:

private Handler mHandler = new Handler();
private static final int NEWS_UPDATE_DELAY = 30*1000;

private Runnable mNewsUpdateHandler = new Runnable() {
     @Override 
     void run() 
     {
          updateNews();
          mHandler.postDelayed(mNewsUpdateHnadler, NEWS_UPDATE_DELAY);
     }
}

private void startNews() 
{
    stopNews();
    mNewsUpdateHandler.run();
}
private void stopNews()
{
    mHandler.removeCallback(mNewsUpdateHandler);    
}
private updateNews()
{
      // your stuff here.
}

まだ持っていない場合は、そのコードを実行するための Service が必要になります。ユーザーが別のアプリに切り替えるとアクティビティがなくなるため、アクティビティから appwidget の継続的な更新を行うことはできません。

于 2012-12-07T22:08:34.137 に答える