2011-10-19 26 views
1

我正試圖完成一些非常簡單的事情。首先,加載我的佈局(main.xml)。然後等待1秒鐘,修改圖像,等待1秒鐘並將其修改爲第三張圖像。 (當然,我的最終目標更復雜,但我甚至無法完成這項工作)。如何在java中以我想要的方式獲得等待/睡眠狀態?

基本上,我在應用程序加載時出現黑屏。它保持這種狀態直到所有等待結束,然後顯示最終圖像。這裏是我的代碼:

super.onCreate(savedInstanceState); 
setContentView(R.layout.main);   

ImageCard[0] = (ImageView)findViewById(R.id.imageView11); 
Thread.sleep(1000); 
ImageCard[0].setImageDrawable(getResources().getDrawable(R.drawable.secondimage)); 
Thread.sleep(1000); 
ImageCard[0].setImageDrawable(getResources().getDrawable(R.drawable.thirdimage)); 

ImageCard [0]是我想改變的圖像。它加載在main.xml中,並且如果我刪除其餘代碼,則顯示正常。

如果我將睡眠時間更改爲5000,則需要10秒才能最終離開黑屏並顯示第三張圖像。這就是我知道它不只是加載緩慢,但它實際上是在等待。

這就像它沒有按順序運行。我不是java專家,所以我假設我正在做一些愚蠢的事情......

感謝您的幫助!

+0

您的標記指出「多線程」,但您的多線程代碼顯示使用後臺線程的位置在哪裏?你讀過關於使用線程的教程嗎? –

+0

也許有一個繪畫事件等着你放開你正在睡覺的UI線程。 –

+2

你應該真的重新考慮你的方法。將主UI線程擱置1秒鐘,以便您可以繪製新圖片,這會導致設備在此期間無響應。用戶將無法做任何事情(除了留下你的應用程序,他們可能會這樣做,因爲他們會認爲你的應用程序「凍結」了他們的設備) – FoamyGuy

回答

0

嘗試添加ImageCard [0] .invalidate(),當你想繪製。

0

我覺得氣墊船充滿了鰻魚是指向你在正確的方向。本質上,你沒有做任何多線程,你告訴主線程等待,這意味着它永遠不會完成繪圖。我不確定Android,但Swing默認使用雙緩衝(以避免屏幕閃爍),但這意味着繪製的內容實際上繪製在緩衝區中,而不是窗口本身,因此您不需要看到什麼。你可以嘗試禁用雙緩衝(Android可能使用的),但這可能會導致其他問題。

你可能想要實際上做多線程,或者,我相信Android可能有一個Timer組件。如果是這樣,我建議你通過Thread.sleep或實際的多線程來使用它。使用定時器,你可以讓它在一秒鐘後觸發一個事件。該事件將執行其他代碼。

2

好的繼承人你的問題,當你在UIThread時,你永遠不能睡覺(...)。 UIThread永遠不會被鎖定,它會導致很多非常糟糕的事情發生在Android中。但是有一個非常簡單的方法,只需在UIThread下面跳轉,然後在需要時跳回去。下面有什麼,我會建議:

public void onCreate(...) 
{ 
    super.onCreate(...); 
    myActivity.setContentView(R.layout.main); 
    new Thread(this).start(); 
} 

public void run() 
{ 
    try 
    { 
     changeLayout(R.layout.main2); 
     Thread.sleep(5000); 
     changeLayout(R.layout.main3); 
     Thread.sleep(10000) 
     changeLayout(R.layout.main4); 
    }catch(Exception e){} 
} 

public void changeLayout(int id) 
{ 
    this.id = id; 
    myActivity.post(new Runnable() 
    { 
     public void run() 
     { 
      myActivity.setContentView(id); 
     } 
    }); 
} 

private int id; 

當然這個例子您的類必須實現Runnable工作。只有UIThread可以訪問UI,其他線程無法訪問。這就是爲什麼你必須跳開和關閉UIThread。希望這工作!

+1

正確的概念,但過於複雜的代碼。使用'ImageView'上的'postDelayed()'來安排在運行延遲之後在主應用程序線程上執行'Runnable'。 – CommonsWare

+0

這也可以工作 – John

+0

您可以擴展您在ImageView上如何使用postDelayed()來安排Runnable嗎?我剛剛嘗試過,但不起作用。 – user1003910

3

我想你是封鎖UI Thead。在靜態處理程序對象上嘗試Handler.postDelayed

+3

你甚至不需要'處理程序'。 'postDelayed()'可以在任何View上使用,例如'ImageView'。 – CommonsWare

+0

不知道,學習永不停止。 –

0

你有構造函數或init()函數中的代碼嗎?如果是的話,只畫第一張圖片,Thread.sleep()函數在構造函數或init()函數被調用的位置之後移動。 然後調用repaint()函數或其他東西。