Слушатель firebase addchildevent не срабатывает

У меня есть вспомогательный класс firebase, в котором я сохраняю данные, а также имею настройку события добавления дочернего прослушивателя. Проблема в том, что после добавления события дочернего прослушивателя оно не срабатывает.

public class FbaseHelper {

DatabaseReference dbRef;
Boolean saved= null;
String codeDescJSON = null;
Gson myGson;
CodeDescMast codeDescMast;
ArrayList<CodeDescMast> cdeDescAryList;

public FbaseHelper() { }
public FbaseHelper(DatabaseReference refDb) {
    this.dbRef = refDb;
}

public void read(Context context) {

    String csvLine;

    InputStream is=null ;
    try {
        is = context.getAssets().open("a.csv") ;
        BufferedReader reader = new BufferedReader(new InputStreamReader(is)) ;
        codeDescMast = new CodeDescMast();
        while((csvLine = reader.readLine())!=null) {
           String[] row = csvLine.split(",") ;
           if (! row[1].equals("Desc")) {

               codeDescMast.setCode(Integer.valueOf(row[0]));
               codeDescMast.setDesc(row[1]);
               fBaseSave();
           }
        }

        is.close();

    } catch(IOException ioex) {
        ioex.printStackTrace();

    }
}

public Boolean fBaseSave() {
    try {
        dbRef.push().setValue(codeDescMast) ;
        saved = true;

    }catch (DatabaseException dbEx) {
        dbEx.printStackTrace();
        saved = false ;

    }

    return saved;
}

   public ArrayList<CodeDescMast> retrieve() {
    dbRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            getData(dataSnapshot,cdeDescAryList);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            getData(dataSnapshot,cdeDescAryList);
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }


    });

    return cdeDescAryList;
}

public void getData(DataSnapshot pDtSnpSht,ArrayList<CodeDescMast> pCdeDscMst) {

    int code;
    String desc;

    pCdeDscMst.clear();

    for(DataSnapshot dSnpSht : pDtSnpSht.getChildren()) {
        code = dSnpSht.getValue(CodeDescMast.class).getCode() ;
        desc = dSnpSht.getValue(CodeDescMast.class).getDesc() ;

        CodeDescMast cdeDscMst = new CodeDescMast(code,desc);
        pCdeDscMst.add(cdeDscMst) ;
    }


}

Это mainactivity.java

public class MainActivity extends AppCompatActivity {

Spinner spnr;
DatabaseReference dbRef;
FbaseHelper fBaseHelp;
CdeDscAdapt cdeDscAdpt;

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

    spnr = (Spinner) findViewById(R.id.ddlbcode);

    dbRef= FirebaseDatabase.getInstance().getReference() ;

    fBaseHelp = new FbaseHelper(dbRef);
    dbInit();

    cdeDscAdpt = new CdeDscAdapt(this, fBaseHelp.cdeDescAryList) ;
    spnr.setAdapter(cdeDscAdpt);

    spnr.setOnItemSelectedListener(spnrItmSelListnr);
}
publ

public void dbInit() {
    fBaseHelp.read(getApplicationContext());
    fBaseHelp.retrieve();
}

public AdapterView.OnItemSelectedListener spnrItmSelListnr = new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        CodeDescMast codeDesc = (CodeDescMast) parent.getItemAtPosition(position);
        int code = codeDesc.getCode();
        String desc = codeDesc.getDesc();
        Toast.makeText(MainActivity.this,"Code:"+ Integer.toString(code) + "/nDesc: "+ desc ,Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
};

}

Вопрос в том, должен ли прослушиватель быть определен внутри основного действия или он может быть определен в другом классе.


person megjosh    schedule 19.04.2018    source источник


Ответы (1)


Вы можете определить код, который читает из базы данных Firebase, в любом классе, который вы хотите. Однако важно то, что код вызывается из правильного метода жизненного цикла действия Android.

Сейчас ваша основная активность вызывает fBaseHelp.read();, который читает CSV-файл, но не читает никаких данных из Firebase. Единственный предоставленный вами метод чтения из Firebase (retrieve()) не вызывается, поэтому данные из Firebase считываться не будут.

Вы также захотите вызвать fBaseHelp.read() из своей основной деятельности.

Обратите внимание, что эта подпись кажется рецептом проблем:

public ArrayList<CodeDescMast> retrieve() {

Данные загружаются из Firebase асинхронно. Поскольку выполнение кода в Android является синхронным, похоже, что вы не можете вернуть список CodeDescMast из метода retrieve. Поскольку трудно помочь с этим, не видя фактического кода, я вместо этого предоставлю список предыдущих вопросов по теме:

person Frank van Puffelen    schedule 19.04.2018
comment
Я отредактировал свой вопрос. теперь вы можете просмотреть MainActivity.xmland FbaseHelper.java. Я пытаюсь отобразить код и описание в виде раскрывающегося списка в счетчике. Файл csv содержит код и описание. Я читаю этот файл и сохраняю его в Firebase. Я хочу прочитать эти данные из Firebase. До сих пор я мог читать CSV-файл и сохранять значения в firebase. прослушиватель событий addchild не вызывается. В onCreate основной деятельности я использую метод вспомогательного класса для определения прослушивателя и его реализации. - person megjosh; 19.04.2018
comment
OnCreate — это метод жизненного цикла Android, который я использую для определения слушателя и его реализации. Мне не нужно ничего возвращать из метода получения. Я определю геттер, который будет возвращать этот объект массива по требованию. - person megjosh; 19.04.2018
comment
это чтение файла и сохранение в firebase, а затем извлечение из Firebase для загрузки счетчика является синхронной задачей, тогда как в Android эта загрузка/извлечение превращается в асинхронную задачу. Я думаю, что мне нужно разделить эти две задачи. Чтение файлов и загрузка в firebase будут происходить отдельно. Значения Spinner будут заполнены отдельно. Мой выбор addchildeventlistener также был неверным, нужно было использовать valueventlistener . Класс FbaseHelper должен быть создан в адаптере, а не в основной деятельности, чтобы я получил доступ к adapter.notifydatachanged - person megjosh; 21.04.2018