有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    在线程中执行的任何操作,包括您调用的方法,仍将在正在运行的线程中执行,而不是在主线程中执行。因此,您实现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是正确的实现