2014-01-11 2 views
0

Я делаю приложение, в котором я должен показать последовательность изображений: Последовательность является продолжением:Как определить последовательность работоспособных

  1. Красного X должен быть показан в течение 400 миллисекунд
  2. изображение называется «Снимок экрана» должно быть показано в течение 500 миллисекунд
  3. изображение называется «шума» должно быть показано в течение 50 миллисекунд
  4. «Noise» изображения исчезают, чтобы освободить место для EditText

Но результат, который выходит, - это красный X, показанный на 400 миллисекунд, а затем пустой экран.

Вот код, который я написал:

private void startThread(){    
     handler.postDelayed(new TaskScreenshot(), 400); 
     handler.postDelayed(new TaskNoise(), 500); 
     handler.postDelayed(new TaskEditText(), 100);  
} 

class TaskScreenshot implements Runnable{ 
    @Override public void run() { 
     myImageView.setImageResource(R.drawable.googleplaybooks2); 
     myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT; 
     myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT; 
    } 
} 

class TaskNoise implements Runnable{ 
    @Override public void run() { 
     myImageView.setImageResource(R.drawable.noise); 
     myImageView.getLayoutParams().width = LayoutParams.MATCH_PARENT; 
     myImageView.getLayoutParams().height = LayoutParams.MATCH_PARENT; 
    } 
} 

class TaskEditText implements Runnable{ 
    @Override public void run() { 
     myInputFragment.getView().setVisibility(View.VISIBLE); 
     myImageFragment.getView().setVisibility(View.INVISIBLE); 
    } 
} 

Красный X уже установлен в ImageView перед началом последовательности.

Есть ли что-то, что я делаю неправильно? Есть Runnable правильный способ выполнения этой последовательности?

+0

может проверить исполнители http://developer.android.com/reference/java/util/concurrent/Executor.html – Raghunandan

+0

Попробуйте опубликовать следующие отложенные задачи в конце предыдущей задачи. Затем запустите T1 после задержки T2. T2 запускается после задержки T3 и так далее ... – Aubin

+0

Обин, что вы имеете в виду? – DamianFox

ответ

3

Методы postDelayed не накапливают задержки. То, что вы хотите сделать, это:

private void startThread(){    
     handler.postDelayed(new TaskScreenshot(), 400); 
     handler.postDelayed(new TaskNoise(), 900); 
     handler.postDelayed(new TaskEditText(), 1000);  
} 
1

Executors.newSingleThreadExecutor() должен быть правильным выбором, если вы хотите конкретную последовательность для некоторых работоспособной в вашем коде.

Javadoc для newSingleThreadExecutor() ниже

Создает Исполнитель, который использует один рабочий поток, работающий от с неограниченной очереди. (Обратите внимание, что если этот единственный поток завершает из-за сбоя во время выполнения до выключения, новый будет займет свое место, если это необходимо для выполнения последующих задач.) Задачи гарантируют выполнение последовательно и не более одного задача будет активна в любой момент времени. В отличии от аналогичного эквивалента newFixedThreadPool (1) возвращенный исполнитель гарантированно не будет реконфигурируется для использования дополнительных потоков.

вы метод startThread может быть записаны, как показано ниже

private void startThread(){ 
    ExecutorService exec = Executors.newSingleThreadExecutor(); 
    exec.execute(new TaskScreenshot()); 
    exec.execute(new TaskNoise()); 
    exec.execute(new TaskEditText()); 
    exec.shutdown(); 
    } 
+0

Есть ли разница между «Executors.newSingleThreadExecutor» (например,) 'и' Runnable'? – DamianFox

+0

Могу ли я установить таймер в 'ExecutorService'? – DamianFox

+0

@DamianFox ScheduledExecutorService будет использоваться для функций, связанных с таймером, и расширяет ExecutorService. – Vipin

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