在下面的代碼部分,我在點擊按鈕時運行了一個執行緒。一開始,該執行緒會向textView設定文本,然后它將睡眠6秒。但是,實際上在點擊按鈕時,一開始,執行緒會休眠6秒,然后會將文本設定到textView中。現在,為什么會發生這種陳述句執行流程的不匹配呢?
public class MainActivity extends AppCompatActivity {
editText編輯文本。
按鈕button。
TextView textView。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(s savedInstanceState)。
setContentView(R.layout.activity_main)。
editText = findViewById(R.id.editText);
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button.setEnabled(false)。
runthread()。
}
});
}
private void runthread() {
final String s1 = editText.getText() .toString()。
Handler handler = new Handler()。
handler.post(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(s1)。
button.setEnabled(true)。
try {
Thread.sleep(6000)。
} catch (InterruptedException e) {
e.printStackTrace()。
}
}
});
}
});
}
}
uj5u.com熱心網友回復:
Android主執行緒建立在兩個核心概念之上Looper和Handler。它轉化為與執行緒相關的訊息回圈,以及訊息互動器。所有的ui人員都受益于此。例如,你所使用的setText只不過是向回圈器發送一個新的訊息,在一段時間后,該訊息被一些處理程式解決。正如你可能猜到的那樣,首先每個訊息都被排隊了。
如果你通過上面的棱鏡來看你的例子,你會看到下面列出的步驟。(所有步驟都是在主執行緒/主回圈器上進行的)
Handler handler = new Handler()。<-- this handler與主回圈器有關。
handler.post(new Runnable() { <-- enqueue new message to Main looper
@Override
public void run() {
runOnUiThread(new Runnable() { <-- enqueue new message)
@Override
public void run() {
textView.setText(s1); <-- enqueue new message of setting text
button.setEnabled(true); <-- enqueue new message of enabling button
try {
Thread.sleep(6000); <--暫停執行緒 for 6 seconds
} catch (InterruptedException e) {
e.printStackTrace()。
}
}
});
}
});
根據上面的說法,你在所有的資訊(包括設定文本和啟用按鈕)被處理之前就暫停了執行緒。這樣做的后果是順序顛倒。
#UPDATE 那么,我怎樣才能把這個sleep()方法也排隊呢?
val handler = Handler()。
handler.post {
runOnUiThread {
textView.text = "ABC"。
button.isEnabled = true;
}
}
handler.postDelayed({
try {
Thread.sleep(6000) 。
} catch (e: InterruptedException) {
e.printStackTrace()。
}
}, 16) <-- 16 milliseconds是一個幀之間的時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325304.html
標籤:
上一篇:每天都在推送的分支上重新建立基地
