log.d 的输出顺序?

Order of output for log.d?

我将 android 应用程序连接到 google 的实时数据库。 (这是为学校准备的,我对所有这些应用程序开发的东西都非常非常陌生。)我想知道为什么我的 log.d() 方法以错误的顺序将其内容输出到 logcat .我不认为这是一个主要问题,我可能会解决它,但我只是想知道为什么它会这样执行,或者如果我的代码有问题我必须修复。

常驻页面:

public class ResidentPage extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        ....
        basicReadWrite();
        MethodsFromOtherClass.output();

        return view;
    }

    ...

    public void basicReadWrite(){
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("second message");

        myRef.setValue("Hello again, World!");

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String value = dataSnapshot.getValue(String.class);
                Log.d("ResidentPage", "Value is: " + value);
            }

            @Override
            public void onCancelled(DatabaseError error) {
                Log.w("ResidentPage", "Failed to read value.", error.toException());
            }
        });
    }
}

其他方法 class:

public class MethodsFromOtherClass {
    public static void output(){
        Log.d("ResidentPage", "Called from another class");
    }
}

Logcat:

D/ResidentPage: Called from another class
D/ResidentPage: Value is: Hello again, World!

它们并没有按错误的顺序发生。您的代码是异步的。在后台线程上收集数据后调用 ValueEventListener。所以它们可以以任何顺序发生——这将是一个竞争条件,其中一个被调用。 (更实际地说,“从另一个 class 调用”几乎总是首先在上面的代码中发生,因为该线程上的代码很少,因此不太可能安排另一个线程并且 运行 之前主线程到达那里,但你可能会偶尔看到它发生)。