如何解决来自线程的方法调用在哪里运行?
这是我要编写的代码
void longRunningMethod() {
new Thread(new Runnable() {
@Override
public void run() {
//a time consuming task
updateUi();
}
}).start();
}
public void updateUi(){
Collections.sort(playerArrayList,Collections.reverseOrder(new Comparator<Player>() {
@Override
public int compare(Player p1,Player p2) {
return Integer.valueOf(p1.getScore()).compareTo(p2.getScore());
}
}));
adapter.notifyDataSetChanged();
//some more code here
}
首先:当我从线程调用updateUi()时,它将在调用它的线程(即longRunningMethod()的线程)上运行还是在主线程中运行? / p>
第二:如代码中所示,我正在对自定义对象的数组列表进行排序,在主线程中运行它是否安全?还是应该使用其他线程?
我知道使用完成监听器实现任务,但是为了更安全,我想在其他线程上运行updateUi方法。
解决方法
在线程中执行的任何操作(包括调用的方法)仍将在运行线程中执行,而不是在主线程中执行。因此,您实现 updateUI 方法的方式将使其仍然在执行线程中运行。
在您的特定情况下,您似乎希望通过适配器通知UI,因此您可以按照以下步骤操作:
public void updateUi(){
Collections.sort(playerArrayList,Collections.reverseOrder(new Comparator<Player>() {
@Override
public int compare(Player p1,Player p2) {
return Integer.valueOf(p1.getScore()).compareTo(p2.getScore());
}
}));
// Notify the UI
final Runnable runnable = () -> adapter.notifyDataSetChanged();
new Handler(Looper.getMainLooper()).post(runnable);
}
通过以下两行通知用户界面:
final Runnable runnable = () -> adapter.notifyDataSetChanged();
new Handler(Looper.getMainLooper()).post(runnable);
请注意,如果仅排序,并且列表很小,可以在几毫秒内完成,那么使用线程可能不是一个好选择,您可以在UI中进行排序。或者,相反,如果实际上是一个很大的列表,可能会在排序时阻止UI,那么将这种逻辑放在线程中并在完成时通知UI是正确的实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。