2014-03-31 72 views
1

我有一個進度條初始設置INVISIBLE.after點擊一個按鈕,我想在酒吧出現超過消失5秒鐘。我使用的Thread.sleep(5000),但沒有發生等待5秒鐘,以進度條是不可見的android系統

public void dec(View v) throws InterruptedException{ 
ProgressBar pbar = (ProgressBar) findViewById(R.id.bar); 
pbar.setVisibility(View.VISIBLE); 
Thread.sleep(5000); 
pbar.setVisibility(View.INVISIBLE);} 

回答

4

那麼你這樣做,凍結UI線程,這樣一種方法是創建一個新的線程,並使用處理器回發到UI線程,所以它不堵塞並可繼續繪製。

例如:

final ProgressBar pbar = (ProgressBar) findViewById(R.id.bar); // Final so we can access it from the other thread 
pbar.setVisibility(View.VISIBLE); 

// Create a Handler instance on the main thread 
Handler handler = new Handler(); 

// Create and start a new Thread 
new Thread(new Runnable() { 
    public void run() { 
     try{ 
      Thread.sleep(5000); 
     } 
     catch (Exception e) { } // Just catch the InterruptedException 

     // Now we use the Handler to post back to the main thread 
     handler.post(new Runnable() { 
      public void run() { 
       // Set the View's visibility back on the main UI Thread 
       pbar.setVisibility(View.INVISIBLE); 
      } 
     }); 
    } 
}).start(); 

而且,正如克里斯如下建議,你應該從處理程序中刪除任何未決的消息時,該活動被關閉,以避免試圖運行在投稿文/ Runnable的時候遇到了一個IllegalStateException在不再存在的活動:

@Override 
public void onDestroy() { 
    handler.removeCallbacksAndMessages(null); 
    super.onDestroy(); 
} 
+0

請務必檢查您從處理程序中刪除回調在活動的onStop – Chris

+0

也,爲什麼你剛纔不叫handler.postDelayed(新的Runnable())。創建單獨的線程會增加很多管理費用和更多內容。 – Chris

+0

我想用postDelayed的,但它並沒有真正做太多解釋線程,而且他正在經歷的UI的阻塞。當然,我可以把短片放在他身上,但從長遠來看這不會有幫助。作爲去除回調,沒錯,你應該和我即將更新帖子雅〜 – Guardanis