java线程的方法调用在哪里运行?
这就是我想写的代码
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()的线程)上运行还是在主线程中运行
其次:在代码中,我正在对自定义对象的arraylist进行排序,在主线程中运行它安全吗?还是我应该用另一根线
我知道用completion Listener实现任务,但我想在不同的线程上运行updateUi方法,只是为了更安全
# 1 楼答案
在线程中执行的任何操作,包括您调用的方法,仍将在正在运行的线程中执行,而不是在主线程中执行。因此,您实现updateUI方法的方式将使它仍然在执行线程中运行
在您的特定情况下,您似乎希望通过适配器通知UI,因此您可以执行以下操作:
用户界面将收到以下两行通知:
顺便说一句,如果你只是在排序,而且列表很小,可以在几毫秒内完成,那么使用线程可能不是一个好选择,你可以在UI中排序。或者,如果相反,实际上是一个大列表,在排序时可能会阻塞UI,那么将此类逻辑放在线程中并在完成时通知UI是正确的实现