0

Я хотел бы периодически отображать белый прямоугольник на экране андроида; или изменить цвет фона. Например, каждые 500 мс я хочу, чтобы цвет экрана изменился с черного на белый, примерно на 200 мс, а затем обратно на черный.Как периодически отображать прямоугольник в активности андроида

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

РЕШЕНИЕ:

С помощью ответившего я решил мою проблему путем создания двух таймеров один для черных и один для белого. Черный цвет задерживается на длительность, на которую я хочу отобразить белый экран. Оба имеют одинаковую скорость выполнения, поэтому отображается белый экран, после длительность мс отображается черный экран. Например, экран черный, но каждые две секунды мигает белым.

@Override 
protected void onResume() { 
    super.onResume(); 

    mBlackTimer = new Timer(); 
    mBlackTimer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        view.setBackgroundColor(Color.parseColor("#000000")); 

       } 
      }); 
     } 
    }, duration, (long) (1000/visionPeriod)); 

    mWhiteTimer = new Timer(); 
    mWhiteTimer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        view.setBackgroundColor(Color.parseColor("#ffffff")); 
       } 
      }); 

     } 
    }, 0, (long) (1000/visionPeriod)); 
} 
+0

вы можете получить доступ к свойствам ui из фона, но сначала вы должны получить доступ к нити ua, вызвать getActivity(). RunOnUiThread(); если вы хотите что-то изменить и поставить логику ожидания за пределы этого потока –

ответ

0

AsyncTask в основном используется для выполнения операций с фоновыми потоками, таких как загрузка данных с удаленного сервера. Он работает на собственном потоке, поэтому, когда из AsyncTask вы пытаетесь получить доступ к любому представлению вашей деятельности, он дает ошибку that only the original thread can touch the View.

Для повторяющихся задач вы можете использовать класс Timer или AlarmManager. Посетите мой предыдущий answer.

3

Вы можете использовать класс таймера для этого выполнить задачу на повторный интервал:

//Declare the timer 
Timer t = new Timer(); 

//Set the schedule function and rate 
t.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     //Called each time when 1000 milliseconds (1 second) (the period parameter) 
    }  
}, 
//Set how long before to start calling the TimerTask (in milliseconds) 
0, 
//Set the amount of time between each execution (in milliseconds) 
1000); 
+0

Я попробовал ваше предложение с view.setBackgroundColor (Color.parseColor («# FFFFFF»)) в методе запуска, но получил ту же ошибку, что и исходная нить может касаться представления. – PerceptualRobotics

+0

вы можете получить доступ к файлам ui с помощью runonuithread. – Meenal

0

Создание метода задания таймера и внутри TimerTask и дать ему периодический длительность 700 мс показать черный фон, а затем создать обработчик для показа на белом фоне и после задержать его 500ms

попробовать все это в uithread только

не используют новую нить или AsyncTask вроде этого:

mTimer = new Timer(); 
    mTtask = new TimerTask() { 
     public void run() { 
      //set your black background here 
      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        // set your white background here 
       } 
      }, 500); 
     } 
    }; 
    mTimer.schedule(mTtask, 1, 700); 
+0

Я поместил этот код в onResume, но получаю эту ошибку «Не могу создать обработчик внутри потока, который не вызвал Looper.prepare()». Что это значит? – PerceptualRobotics

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