2011-09-27 75 views
0

爲什麼在線程啓動之前按鈕的背景沒有改變?線程休眠結束後它會改變。我提到,如果沒有線程,背景會發生變化。線程前的按鈕背景

answer1Top.setBackgroundDrawable(correct); 
try { 
    Thread.sleep(2000); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

//I want to stop this 
playerScTop--; 
playerScoreTop.setText(String.valueOf(playerScTop)); 
+0

不要'睡眠()'在UI線程,不更新關閉UI線程UI組件。你想達到什麼目的? –

+0

我想設置一個背景2秒,然後我想設置另一個背景,線程睡眠時間過後 – Alex

回答

2

創建延伸AsyncTask一個新的類,它傳遞View其改變背景以及兩個後臺Drawable實例,則:

    onPreExecute()(上UI線程運行)
  • ,設置第一背景上繪製的視圖
  • doInBackground()(運行在後臺線程),睡眠2秒
  • onPostExecute()(運行Ò ñUI線程),設置其它可繪製你的看法

未經測試示例代碼:

public class BackgroundChangeTask extends AsyncTask<Void, Void, Void> { 

    private View view; 
    private Drawable background1; 
    private Drawable background2; 

    public BackgroundChangeTask(View view, Drawable background1, Drawable background2) { 
     this.view = view; 
     this.background1 = background1; 
     this.background2 = background2; 
    } 

    @Override 
    protected void onPreExecute() { 
     view.setBackgroundDrawable(background1); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      // too bad 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     view.setBackgroundDrawable(background2); 

     // add anything else you want to run "after 2 seconds" here, e.g. 
     playerScTop--; 
     playerScoreTop.setText(String.valueOf(playerScTop)); 
    } 
} 

調用從活動/片段/等這樣的(無需保持創建的任務各地在現場):

new BackgroundChangeTask(BackgroundChangeTask, correct, theOtherDrawable).execute(); 
+0

但我認爲這不會阻止我的代碼2秒。我認爲這會在後臺運行。我對嗎? – Alex

+0

是的,因爲你根本不想阻塞UI線程,更不用說2秒。 Android可能會強制關閉您的應用程序。 –

+0

你沒有提到你想在你的問題中「停止你的代碼」 - 如果你想,你需要更具體的關於你想要停止什麼,最好不要是UI線程:) –

2
answer1Top.setBackgroundDrawable(correct); 

new Handler().postDelayed(new Runnable() { 

    @Override 
    public void run() { 
      playerScTop--; 
      playerScoreTop.setText(String.valueOf(playerScTop)); 
    } 

}, 2000); 
+0

比我的方法更優雅:) –

+0

謝謝你也感謝@Philipp Reichart – Alex

+0

@亞歷山大看到你接受了我的答案,我真的會推薦這個答案在我的。它更優雅更短。 –