addValueEventListener Firebase Android 后数据丢失

阿维纳什·普拉巴卡尔

在 addValueEventListener 中,我正确获取了 firebase 数据库的数据。我将该数据复制到名为 newDay 的变量中。但是,一旦我退出addValueEventListener,数据就消失了。如何确保数据保留?

        mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
        String current_uid = mCurrentUser.getUid();
        mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(current_uid).child("week").child(day);
        newDay = new ArrayList<Integer>();
        mUserDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                newDay.addAll((ArrayList<Integer>)dataSnapshot.getValue());
                Log.d("newday", "onDataChange:"+newDay.toString());

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        Log.d("after","value " +newDay.toString());

这些是日志结果:

03-04 00:01:28.475 7961-7961/com.example.fake9.tendee D/newday: onDataChange:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

在之后, newDay 奇怪地是空的。

03-04 00:04:54.665 9906-9906/com.example.fake9.tendee D/after: value []

如果详细信息不够,则提供完整代码。许多部分似乎无关紧要:

public class ScheduleActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    private Toolbar mToolbar;
    private Spinner chooseDay;
    private TimePicker startTime;
    private TimePicker endTime;
    private Button busyBtn;
    private Button freeBtn;
    String day;
    Map<String,ArrayList<Integer>> changeweek;
    ArrayList<Integer> test;
    ArrayList<Integer> newDay;

    private DatabaseReference mUserDatabase;
    private FirebaseUser mCurrentUser;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_schedule);

        mToolbar = (Toolbar)findViewById(R.id.schedule_toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Schedule");

        chooseDay = (Spinner)findViewById(R.id.chooseDay_spinner);
        chooseDay.setOnItemSelectedListener(this);
        List<String> week = new ArrayList<String>();
        week.add("Monday");
        week.add("Tuesday");
        week.add("Wednesday");
        week.add("Thursday");
        week.add("Friday");
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,week);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        chooseDay.setAdapter(dataAdapter);

        startTime = (TimePicker)findViewById(R.id.start_timePicker);
        endTime = (TimePicker)findViewById(R.id.end_timePicker);
        freeBtn = (Button)findViewById(R.id.free_btn);
        freeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int startHour = startTime.getCurrentHour();
                int startMin = startTime.getCurrentMinute();
                int endHour = endTime.getCurrentHour();
                int endMin = endTime.getCurrentMinute();
                int startIndex = 0;
                int endIndex = 0;
                int intervals = 0;
                //Log.d("hour", "onClick: "+startHour);
                //Log.d("minute", "onClick: "+startMin);
                if (startHour < 9 || startHour > 17 || endHour < 9 || endHour > 17) {
                    Toast.makeText(ScheduleActivity.this, "invalid time", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (startHour > endHour) {
                    Toast.makeText(ScheduleActivity.this, "impossible time", Toast.LENGTH_SHORT).show();
                    return;
                }
                startIndex = (startHour - 9) * 2;
                if (startMin >= 30) {
                    startIndex = startIndex + 1;
                }
                //Log.d("startIndex", "onClick: "+startIndex);
                endIndex = (endHour - 9) * 2;
                if (endMin >= 30) {
                    endIndex = endIndex + 1;
                }
                final int finalstart = startIndex;
                final int finalend = endIndex;
                //Log.d("endIndex", "onClick: "+endIndex);
                mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
                String current_uid = mCurrentUser.getUid();
                mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(current_uid).child("week").child(day);
                newDay = new ArrayList<Integer>();
                mUserDatabase.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        newDay.addAll((ArrayList<Integer>)dataSnapshot.getValue());
                        Log.d("newday", "onDataChange:"+newDay.toString());

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
                Log.d("after","value " +newDay.toString());
                intervals = endIndex - startIndex;
                for (int i = startIndex; i < endIndex; i++) {
                    Log.d("indexes", "onClick: "+i);
                }
            }
        });
    }
努曼·查

线

Log.d("after","value" + newDay.toString());

在 firebase 从数据库获取结果之前调用。您需要做的就是创建一个方法

public void printResult(){
  Log.d("after","valu" + newDay.toString());
}

现在将此方法称为

newDay = new ArrayList<Integer>();
        mUserDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {


newDay.addAll((ArrayList<Integer>)dataSnapshot.getValue());
                Log.d("newday", "onDataChange:"+newDay.toString());
                printResult();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

原因

Firebase 有它自己的异步机制,比如 volley 库 onDataChange 函数将在 firebase 从互联网获得一些结果时调用,并像往常一样执行下面的代码,下面的代码是你的 Log.d("after","value"+newDay.toString ()); 线。

希望这会帮助你。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章