2014-01-11 55 views
0

我做的,我有顯示圖片的序列中的應用順序:順序爲後續:如何決定的可運行

  1. 紅色X必須顯示了400毫秒
  2. 稱爲「屏幕截圖」的圖像必須被顯示爲500毫秒中顯示爲50毫秒
  3. 「噪聲」圖像
  4. 稱爲「噪聲」的圖像具有消失,以騰出空間用於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); 
    } 
} 

紅色XImageView序列開始前已經設置。

有什麼我做錯了嗎? 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()低於

創建一個使用單個worker線程的 無界隊列操作執行器。 (但是,請注意,如果由於在關閉之前的執行期間發生故障導致該單線程終止 ,如果需要執行後續任務,則新的線程將取代其位置。)任務爲 保證按順序執行,並且不超過一個在任何給定時間任務將爲 有效。與其他等效的 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