Activity.runOnUiThread方法理解,你學會了嗎?
作者:Reathin
在Android中,UI線程是負責處理UI相關(guān)的事件和更新UI的。如果在非UI線程中直接更新UI,會導致應用程序崩潰或出現(xiàn)其他不可預知的問題。runOnUiThread 提供了一種從非UI線程更新UI的方式,確保UI操作在UI線程中執(zhí)行。
runOnUiThread 是Android開發(fā)中一個重要的方法,可以在非UI線程中切換到UI線程來執(zhí)行一些UI相關(guān)的操作。
作用與用途
- 「更新UI」:在Android中,UI線程是負責處理UI相關(guān)的事件和更新UI的。如果在非UI線程中直接更新UI,會導致應用程序崩潰或出現(xiàn)其他不可預知的問題。runOnUiThread 提供了一種從非UI線程更新UI的方式,確保UI操作在UI線程中執(zhí)行。
- 「保持線程安全」:使用 runOnUiThread,可以確保在多線程環(huán)境下,UI的更新是線程安全的。
原理解析
Activity源碼中runOnUiThread方法:
final Handler mHandler = new Handler();
private Thread mUiThread;
// ...
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
// ...
}
- 「Handler機制」:runOnUiThread 的原理基于Android的 Handler 機制。當調(diào)用 runOnUiThread 時,如果當前線程是UI線程,則直接執(zhí)行傳入的 Runnable 的 run 方法。如果當前線程不是UI線程,會將 Runnable 對象封裝成一個 Message 對象,并將其發(fā)送到UI線程的消息隊列中。
- 「消息隊列」:UI線程中有一個消息隊列(MessageQueue),用于存儲待處理的消息。當UI線程空閑時,會從消息隊列中取出消息并執(zhí)行。
- 「Looper」:UI線程中還有一個 Looper 對象,負責不斷地從消息隊列中取出消息并執(zhí)行。當調(diào)用 Handler 的 post 方法或 sendMessage 方法時,實際上是將任務發(fā)送到 Looper 的消息隊列中。
使用示例
- 「調(diào)用方式」:runOnUiThread 是 Activity 類中的一個方法,只能在 Activity 或 Fragment 中使用。
- 「參數(shù)」:runOnUiThread 接受一個 Runnable 參數(shù)。在 Runnable 的 run 方法中編寫需要在UI線程中執(zhí)行的代碼。
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
textView = findViewById(R.id.tv_test);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 更新UI
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("更新后的文本");
}
});
}
}).start();
}
}
注意事項
- 「只能在Activity或Fragment中使用」:由于 runOnUiThread 是 Activity 類的方法,因此只能在 Activity 或 Fragment 的上下文中使用。
- 「避免頻繁調(diào)用」:runOnUiThread 提供了方便的線程切換方式,頻繁地從非UI線程切換到UI線程會增加線程切換的開銷,影響應用的性能。
- 「確保線程安全」:在使用 runOnUiThread 時,需要確保傳遞的 Runnable 對象是線程安全的,以避免出現(xiàn)競態(tài)條件等線程安全問題。
責任編輯:武曉燕
來源:
沐雨花飛蝶