【问题标题】:Order of output for log.d? [duplicate]log.d 的输出顺序? [复制]
【发布时间】:2022-02-06 13:54:58
【问题描述】:

我将我的安卓应用程序连接到了谷歌的实时数据库。 (这是给学校的,我对所有这些应用程序开发的东西都非常非常陌生。)我想知道为什么我的 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());
            }
        });
    }
}

其他类的方法:

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!

【问题讨论】:

标签: android android-studio firebase-realtime-database


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多