Android:确保 UI 操作在 UI 线程上完成的最佳实践
Android: Best practice to ensure that a UI operation is done on UI thread
我遇到了需要从两个不同的线程执行一些相同的 UI 操作(比如说显示 Toast
消息)的情况。区别在于第一个线程是 activity 的 UI 线程,另一个是我开始 运行 某些后台进程的单独线程。问题是确保显示 Toast
消息的代码始终来自 UI 线程的 运行 的最佳实践是什么。我在这里看到两种可能性。
我们有一个函数应该显示像
这样的测试消息
private void showToast() {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
并且每次我们调用此方法时,我们确保必须在 UI 线程上调用它,我们可以从我们调用 showToast()
的地方使用 runOnUiThread()
。
另一种选择是确保显示 Toast
的代码是方法 showToast()
本身中 UI thread
上的 运行。像这样的东西:
private void showToast() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
});
}
首选做法是什么?为什么?
使用第二个选项。如果您已经在 UI-Thread 上,则该操作只会在相同的上下文中执行。 Reference
如果您询问如何确定我们当前是否在 UI 线程上,那么我建议您这样做:
Looper.myLooper() == Looper.getMainLooper()
如果我们在 UI 线程上,这将 return 为真。
否则你可以在这个方向上更深入地搜索:
https://developer.android.com/training/multiple-threads/communicate-ui.html
使用第二个选项很有用,但是 Android 模式建议在使用线程时使用 AsyncTask 线程,因为您有 3 种不同的方式来使用 UI 线程(onPreExecute、onProgressUpdates和 onPostExecute).
https://developer.android.com/reference/android/os/AsyncTask.html
我遇到了需要从两个不同的线程执行一些相同的 UI 操作(比如说显示 Toast
消息)的情况。区别在于第一个线程是 activity 的 UI 线程,另一个是我开始 运行 某些后台进程的单独线程。问题是确保显示 Toast
消息的代码始终来自 UI 线程的 运行 的最佳实践是什么。我在这里看到两种可能性。
我们有一个函数应该显示像
这样的测试消息private void showToast() {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
并且每次我们调用此方法时,我们确保必须在 UI 线程上调用它,我们可以从我们调用 showToast()
的地方使用 runOnUiThread()
。
另一种选择是确保显示 Toast
的代码是方法 showToast()
本身中 UI thread
上的 运行。像这样的东西:
private void showToast() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
});
}
首选做法是什么?为什么?
使用第二个选项。如果您已经在 UI-Thread 上,则该操作只会在相同的上下文中执行。 Reference
如果您询问如何确定我们当前是否在 UI 线程上,那么我建议您这样做:
Looper.myLooper() == Looper.getMainLooper()
如果我们在 UI 线程上,这将 return 为真。 否则你可以在这个方向上更深入地搜索: https://developer.android.com/training/multiple-threads/communicate-ui.html
使用第二个选项很有用,但是 Android 模式建议在使用线程时使用 AsyncTask 线程,因为您有 3 种不同的方式来使用 UI 线程(onPreExecute、onProgressUpdates和 onPostExecute).
https://developer.android.com/reference/android/os/AsyncTask.html