如何使用onDataChange返回方法中的对象?

时间:2019-04-13 16:24:18

标签: java android firebase firebase-realtime-database

我是Firebase的新手。我有一个方法,该方法返回从firebase数据库检索的驱动程序对象。请帮助我。

我做了研究,发现问题在于onDataChange()是异步的,因此被称为last。因此,我尝试将最终的return语句放入onDataChange()中。这产生了一个错误:“无法从无效结果类型的方法返回值”。一些解决方案建议将返回类型保存在变量中,并在最后将其返回,但是此解决方案是针对原始数据类型的,这不是我的情况。

private Driver getOneAvailableDriver(String driverUid) {
        //get the driver's uid code in the available drivers node
        final DatabaseReference driverUidRef = FirebaseDatabase.getInstance().getReference(getString(R.string.drivers_available))
                .child(driverUid);

        final Driver driver = new Driver();
        //get the driver's track
        driverUidRef.child(getString(R.string.track)).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String track = dataSnapshot.getValue(String.class);
                driver.setTrack(track);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        //get the driver's location
        DatabaseReference locationRef = driverUidRef.child("l");
        locationRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                ArrayList<Double> customLocation = (ArrayList<Double>) dataSnapshot.getValue();
                LatLng location = new LatLng(customLocation.get(0), customLocation.get(1));
                driver.setLocation(location);

                Log.i("getOneAvailableDriver", driver.toString());
                return driver; //here where I tried the second time
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        Log.i("getOneAvailableDriver", driver.toString());
        return driver;
    }

1 个答案:

答案 0 :(得分:0)

  

这产生了一个错误:“无法从void方法返回值   结果类型”。

由于类型为空,您不能返回任何值。

修改

您可以在 $job_positions =array('0' => 'Select', '1' => 'IT Staff', '2' => 'Customer Care', '3' => 'Sales', '4' => 'Doctor'); $options_selected =array('1' => 'IT Staff','2' => 'Doctor'); $opt_array=array(); // extract the job position for ($i=0; $i < count($job_positions); $i++) { $disabled = ''; // extract the options_selected and compare with the job position and if match overwrite the variable disabled for ($x=1; $x <= count($options_selected); $x++) { if ($options_selected[$x]==$job_positions[$i]) { $disabled = 'disabled'; } } $opt_array[]= '<option '.$disabled.' value="'.$job_positions[$i].'">'.$job_positions[$i].'</option>'; } echo form_dropdown('category', $opt_array); 内创建一个方法,并将驱动程序对象作为参数传递。

onDataChange()

如果您想了解更多信息,可以参考此post