Прочитайте данные в Firebase и нарисуйте линейный график, используя библиотеку MpAndroidChart - PullRequest
0 голосов
/ 27 августа 2018

Привет, ребята, я пишу приложение, которое будет считывать данные, хранящиеся в Базе данных реального времени Firebase, и рисовать линейную диаграмму с этими данными, используя libaray MPAndroidChart Android Studio.

Мои данные в базе данных реального времени непрерывно получаются и загружаются с помощью сценария Python, который будет собирать данные датчиков на плате разработки Waspmote из последовательного порта. ( Эта частьможет не относиться к моему приложению, так как структура данных была зафиксирована на Firebase)

Структура базы данных реального времени показана следующим образом:

enter image description here

Тогда вот мой MainActivity код для приложения для рисования:

public class MainActivity extends AppCompatActivity  {

    private LineChart Temp_linechart;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

    }

    @Override
    protected void onStart() {
        super.onStart();

        DatabaseReference mPostReference = FirebaseDatabase.getInstance().getReference("Indoor");
        mPostReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Temp_linechart = (LineChart) findViewById(R.id.Data_of_Temp);
                final ArrayList<Entry> yData = new ArrayList<>();
                LineDataSet lineDataSet = new LineDataSet(yData,"Temp");

                for (DataSnapshot ds : dataSnapshot.getChildren()){
                    Long tsLong = System.currentTimeMillis()/1000;
                    float SensorValue = (float)ds.child("P1").getValue();
                    yData.add(new Entry(tsLong,SensorValue));
                }

                LineData data = new LineData (lineDataSet);
                Temp_linechart.setData(data);
                Temp_linechart.notifyDataSetChanged();
                Temp_linechart.invalidate();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(MainActivity.this, "Fail to load post", Toast.LENGTH_SHORT).show();

            }
        });
    }
}

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

sensordata_vis остановился

Пожалуйста, помогите, я действительно новичок в Android Studio.Спасибо.

ОК, после того как я применил метод @Umar Hussain.Сборка прошла успешно.В окне run отображается error1 error2
А в окне logcat отображается error3 error4

Спасибо


Наконец-то я добился того, чего хочу, вот мой отредактированный код:

public class MainActivity extends AppCompatActivity  {

    private LineChart Temp_linechart;
    ArrayList<Entry> yData;
    DatabaseReference mPostReference;
    ValueEventListener valueEventListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        Temp_linechart = (LineChart) findViewById(R.id.Data_of_Temp);

        mPostReference = FirebaseDatabase.getInstance().getReference("Indoor");
        mPostReference.addValueEventListener(valueEventListener= new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                yData = new ArrayList<>();
                float i =0;
                for (DataSnapshot ds : dataSnapshot.getChildren()){
                    i=i+1;
                    String SV = ds.child("P1").getValue().toString();
                    Float SensorValue = Float.parseFloat(SV);
                    yData.add(new Entry(i,SensorValue));
                }
                final LineDataSet lineDataSet = new LineDataSet(yData,"Temp");
                LineData data = new LineData(lineDataSet);
                Temp_linechart.setData(data);
                Temp_linechart.notifyDataSetChanged();
                Temp_linechart.invalidate();
            }

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

            }
        });

    }

}

1 Ответ

0 голосов
/ 27 августа 2018

Сначала переместите свой код, чтобы получить ссылку на диаграмму за пределами слушателя, на onCreate().

Также переместите инициализацию MpAndroidChart в метод oncreate.

 final ArrayList<Entry> yData;
 LineDataSet lineDataSet;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        Temp_linechart = (LineChart) findViewById(R.id.Data_of_Temp);
        yData = new ArrayList<>();
        lineDataSet = new LineDataSet(yData,"Temp");
        LineData data = new LineData (lineDataSet);
        Temp_linechart.setData(data);
        Temp_linechart.notifyDataSetChanged();
        //Temp_linechart.invalidate();

    }

Далее внутри вашегослушатель события value, только очистите список массивов и заполните его заново.И позвоните уведомить и сделать недействительным на графике.

DatabaseReference mPostReference;
ValueEventListener valueEventListener;
@Override
    protected void onStart() {
        super.onStart();

        mPostReference = FirebaseDatabase.getInstance().getReference("Indoor");
        mPostReference.addValueEventListener(valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                yData.clear();

                for (DataSnapshot ds : dataSnapshot.getChildren()){
                    Long tsLong = System.currentTimeMillis()/1000;
                    float SensorValue = (float)ds.child("P1").getValue();
                    yData.add(new Entry(tsLong,SensorValue));
                }
                Temp_linechart.notifyDataSetChanged();
                Temp_linechart.invalidate();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(MainActivity.this, "Fail to load post", Toast.LENGTH_SHORT).show();

            }
        });
    }

Наконец, в вашем onStop удалите слушателя, так как слушатель не привязан к жизненному циклу фрагмента или действия, вы должны сделать это вручную.

PS: попробуйте использовать Camelcase в Java какэто самый распространенный стиль, используемый разработчиками Java и легко читаемый для нас.

...