переключение виджета изображения на временной шкале - PullRequest
0 голосов
/ 28 января 2020

Я хочу создать виджет android с переключением изображения с временной задержкой. Я понятия не имею о том, как это сделать. Должен ли я создать тему в методе onUpdate? Вот пример моего макета. xml file:

    <ImageButton
        android:id="@+id/imageViewWGT"
        android:background="@drawable/dog" />

, и вот что я хочу знать, как это исправить:

public class MainActivity extends AppWidgetProvider {
    private int counter = 0;
    private ImageView wgt_img;
    wgt_img = wgt_img.findViewById(R.id.imageViewWGT);

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            if (counter%2 == 0){
                                wgt_img.setImageResource(R.drawable.dog);
                            }else
                                wgt_img.setImageResource(R.drawable.cat);

                        }
                    });
                    counter++;
                    try {
                        Thread.sleep(1000);     // sleep 1 sec
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

Ответы [ 3 ]

0 голосов
/ 28 января 2020

когда вам нужно запустить блок кода по расписанию, вы можете использовать таймер. посмотрите на этот пример кода:

new Timer().scheduleAtFixedRate(new TimerTask() 
    {
        @Override
        public void run() 
        {
            //you'r code        
        }
    } , DELAY , PERIOD);

добавьте свой код в метод run и замените время задержки и период выполнения вместо DELAY и PERIOD. DELAY и PERIOD - это миллисекунды

. Также, если вы хотите выполнить код блока один раз с задержкой, вы можете использовать Handler.

new Handler().postDelayed(new Runnable() 
    {
        @Override
        public void run() 
        {
            //you'r code
        }
    } , DEALY_MILLIS);
0 голосов
/ 02 февраля 2020

android имеет метод по умолчанию для обновления виджета на временной шкале

<appwidget-provider
    ...
    ...
    ...
    ...
    android:updatePeriodMillis="1000000">
</appwidget-provider>

Но он работает, если вы обновляете виджет не менее 30 минут

0 голосов
/ 28 января 2020

Вы можете использовать postDelayed метод класса Handler, например

// Initialisation
Handler handler = new Handler();
int counter = 0;
long switchDelay = 1000L;

// Function for switch images
public void switchImage(){
     handler.postDelayed(new Runnable() {
         @Override
         public void run() {
             if (counter%2 == 0){
                 wgt_img.setImageResource(R.drawable.dog);
             }else {
                 wgt_img.setImageResource(R.drawable.cat);
             }
             counter++;
             // Recall method
             switchImage();
         }
     }, 1000);
 }
...