2017-07-30 21 views
1

我有一個關於Android Studio的問題:Java Android Studio:在其自己的收聽器中更改視圖的屬性

我有一個圖像視圖。我們稱之爲ImageView。我在這個ImageView上調用了方法setOnCLickListener,並且有一個聽衆新的View.OnclickListener()。 在此偵聽器的方法onClick()中,我更改了此imageView的屬性(顏色,圖像本身...)。例如,我使用imageView.setImageResource(R.drawable.new_image)更改圖像。然後我用Thread.sleep(10000)等待10秒。然後我用imageView.setImageResource(R.drawable.previous_image)將之前的圖像放回去。

這裏是我的問題:

我期望的ImageView改變自己的形象,持續10秒,然後讓前面的圖像回來。但是,我發現這個ImageView沒有任何改變。我只看到第一張圖片...有人能解釋我爲什麼嗎?

我希望我已經夠清楚了...先謝謝你的幫助:)!

+0

請發佈您的代碼。 – Abhi

回答

2

首先,您應該閱讀Processes and Threads指南以瞭解線程在Android上的工作方式。

如果你有與該做,你就會明白,你做什麼,因爲你凍結的主(UI)線程,這意味着應用程序,直到10秒後不會對任何事件作出響應是非常糟糕的。這也會導致ANR(應用程序未響應)對話框相當差 UX。

你基本上需要等待期內委託給另一個線程(或至少一個隊列),然後在時機成熟時,再回到UI線程和設定的屬性你想要的任何看法。有很多方法可以實現這一點,您應該閱讀Communicating with the UI Thread瞭解更多詳情。這裏只是一個快速的示例:

Handler handler = new Handler(Looper.getMainLooper()); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     // write here what you want to happen in 10 seconds on the UI thread 
    } 
}, 10000); // 10s = 10,000ms 

這裏有一些注意事項,但:

  1. 保存您在這裏創建一個變量Runnable因爲如果用戶從該屏幕在10秒內導航離開,它會仍然在裏面運行代碼,這可能會導致各種例外。在這種情況下,您需要在用戶離開屏幕時通過調用handler.removeCallbacks(runnable);從處理程序中刪除Runnable
  2. 每次發生點擊事件時都不要創建新的Handler實例。在ActivityonCreate(...)方法中創建它,並在屏幕的其餘部分使用該實例。
  3. 可以創建Handler沒有Looper參數,這將創建當前線程的Looper的處理程序,並因爲它被UI線程上創建的,將現在被罰款。不過,我決定最好還是告訴你,因爲你可能最終做在後臺線程可能會導致意外的行爲,如果你不明白的還穿類似的東西更安全的方式。
+0

它現在正在工作...但我會繼續研究這個問題! THx很明顯的答案! –

3

R.id.drawable.previous_image?它應該是R.drawable.previous_image

+0

對不起,我的意思是R.drawable.previous_image! THx捕捉它!我剛剛編輯它! –

0

其實我很抱歉回到這個問題上,但即使您的答案是完美的,我仍然有一個問題。 我明白,讓線程睡覺是一個壞主意。但是,如果我只是更改圖像資源,然後經過一個循環(例如1到10000)......所以線程不會休眠......然後返回到之前的圖像資源。這是不是應該讓圖像改變兩次? (其實它不是...我已經測試過...它沒有注意到圖像的變化)

相關問題