【问题标题】:code continue to run before onDataChange finished代码在 onDataChange 完成之前继续运行
【发布时间】:2018-05-08 23:40:00
【问题描述】:

我在片段选项卡上的 oncreate :

 @Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.tab1_frag, container, false);
    Bundle bundle = this.getArguments();
    if (bundle != null) {
        class_name = bundle.getString("tab1");
    }
    recyclerView = view.findViewById(R.id.recyclerview_tab1);
    recyclerViewAdepter = new RecyclerViewAdepter(getContext(), list);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));
    recyclerView.setAdapter(recyclerViewAdepter);

    class_name = "oops";
    Log.d("tag6", class_name);
    return view;


}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    mapFromDB = new HashMap<String, String>();
    Log.d("tag1", class_name);
    db = FirebaseDatabase.getInstance().getReference().child("CLASS").child("123").child("day1");
    db.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.d("tag2", "ok");
            for (DataSnapshot dbclass : dataSnapshot.getChildren()) {
                mapFromDB.put(dbclass.getKey().toString(), dbclass.getValue().toString());
                Log.d("tag3", "ok");
            }
            recyclerViewAdepter.set_map(mapFromDB);
            check = "123";
            Log.d("tag4", check);
            adding();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

            check = "456";
            adding();

        }
    });


}

public void sendToDB()

{
    db = FirebaseDatabase.getInstance().getReference().child("CLASS").child(class_name).child("day1");
    db.setValue(recyclerViewAdepter.get_map());

}


void adding() {
    Log.d("tag5", check);
    list = new ArrayList<>();
    list.add(new days_fragment(ourdata.Hours[0], check));
    list.add(new days_fragment(ourdata.Hours[1]));
    list.add(new days_fragment(ourdata.Hours[2]));
    list.add(new days_fragment(ourdata.Hours[3]));
    list.add(new days_fragment(ourdata.Hours[4]));
    list.add(new days_fragment(ourdata.Hours[5]));
    list.add(new days_fragment(ourdata.Hours[6]));
    list.add(new days_fragment(ourdata.Hours[7]));
    list.add(new days_fragment(ourdata.Hours[8]));
    list.add(new days_fragment(ourdata.Hours[9]));
    list.add(new days_fragment(ourdata.Hours[10]));
    list.add(new days_fragment(ourdata.Hours[11]));
    list.add(new days_fragment(ourdata.Hours[12]));

}

logcat 的结果是:

com.example.project D/tag1: tt

com.example.project D/tag5: 000

com.example.project D/tag6: 哎呀

com.example.project D/tag2: 好的

com.example.project D/tag3: 好的

com.example.project D/tag4: 123

标签 5&6 在 2,3,4 之前 为什么会发生这种情况以及如何解决?

【问题讨论】:

  • Firebase 是异步的。
  • 我建议你从这个 post 看到我的 anwser 的最后一部分,也看看这个 video。跨度>
  • 我明白这一点。但是我如何让那部分在别人之前做呢? db.addValueEventListener(new ValueEventListener() 上的变量“检查”发生变化,如果在此之前运行其他代码,检查将不正确

标签: android firebase firebase-realtime-database


【解决方案1】:

Firebase 事件侦听器异步工作。在 onCreateView 方法上检索数据必须解决您的问题。这将使您的代码更不可读且难以理解,但直到现在这是我可以应用并获得结果的解决方案。如果您找到更好的解决方案,请告诉我。

【讨论】:

    猜你喜欢
    • 2011-11-01
    • 2021-10-19
    • 2021-09-28
    • 2021-12-29
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2015-03-25
    相关资源
    最近更新 更多