我已陷入需要从两个不同的线程进行相同的UI操作(让我们显示Toast
消息)的情况。区别在于第一个线程是活动的UI线程,另一个是我开始运行某个后台进程的单独线程。问题是确保显示Toast
消息的代码始终从UI线程运行的最佳实践是什么。我在这里看到两种可能性。
我们有一个函数应该显示测试消息,如
private void showToast() {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
每次调用此方法时,我们都要确保必须在UI线程上调用它,我们可以从我们调用runOnUiThread()
的地方使用showToast()
。
另一个选项是确保显示Toast
的代码在方法UI thread
内的showToast()
上运行。这样的事情:
private void showToast() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
});
}
哪种做法是首选?为什么?
答案 0 :(得分:1)
使用第二个选项。如果您已经在UI-Thread上,则该操作仅在相同的上下文中执行。 Reference
答案 1 :(得分:1)
如果你问如何确定我们目前是否在UI线程上,那么我建议这样做:
Looper.myLooper() == Looper.getMainLooper()
如果我们在UI线程上,这将返回true。 否则你可以在这个方向上更深入地搜索: https://developer.android.com/training/multiple-threads/communicate-ui.html
答案 2 :(得分:0)
使用第二个选项很有用,但Android模式建议您在使用线程时使用AsyncTask线程,因为您有3种不同的方式来使用UI线程(onPreExecute,onProgressUpdates和onPostExecute)。
https://developer.android.com/reference/android/os/AsyncTask.html