AChartEngine — диаграммы с данными с сайта parse.com не будут отображаться

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

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;

import java.util.ArrayList;

public class LineGraph {

    public ArrayList<Integer> dataArray;

    XYMultipleSeriesDataset dataset;
    XYMultipleSeriesRenderer renderer;
    public static boolean ClickEnabled = true;

    public Intent getIntent(Context context) {

        ArrayList<Integer> y = this.dataArray;

        XYSeries seriesY = new XYSeries("Y");
        for (int i = 0; i < y.size(); i++) {
            seriesY.add(i, y.get(i));
        }
        dataset = new XYMultipleSeriesDataset();
        dataset.addSeries(seriesY);

        renderer.setPanEnabled(true, false);
        renderer.setClickEnabled(ClickEnabled);
        renderer.setBackgroundColor(Color.WHITE);
        renderer.setApplyBackgroundColor(true);
        renderer.setChartTitle("Simple data");
        renderer.setAxesColor(Color.BLACK);
        XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
        XYSeriesRenderer renderer = new XYSeriesRenderer();
        renderer.setColor(Color.RED);
        renderer.setPointStyle(PointStyle.DIAMOND);
        mRenderer.addSeriesRenderer(renderer);

        Intent intent = ChartFactory.getLineChartIntent(context, dataset, mRenderer, "Line Graph Title");
        return intent;
    }

    public void getData() {
        ParseQuery<ParseObject> query = ParseQuery.getQuery("Counters_data");
        query.getInBackground("lxFzCTeOcl", new GetCallback<ParseObject>() {
            public void done(ParseObject parseObject, ParseException e) {

                if (e == null) {
                    String object = parseObject.getString("value");
                    Integer objectValue = Integer.parseInt(object);
                    if (dataArray == null) {
                        dataArray = new ArrayList<Integer>();
                        dataArray.add(objectValue);
                    }
                } else {
                    Log.d("score", "Error: " + e.getMessage());
                }
            }
        });
    }
}

И вот как я вызываю диаграммы:

public void lineGraphHandler(View view) {
        LineGraph line = new LineGraph();
        line.getData();
        Intent lineIntent = line.getIntent(this);
        startActivity(lineIntent);
    }

И часть XML:

<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/counters"
        android:onClick="lineGraphHandler"
        android:text="Charts"
        android:id="@+id/charts"/>

Вот мой логарифм:

Я не понимаю, где проблема. Мое приложение запускается, но сразу же падает, когда я нажимаю кнопку «диаграмма». Это проблема типа данных или потому что я что-то неправильно понимаю? Заранее спасибо.

Я пробовал так, но все равно сбой:

Ваш

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.Log;

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;

import java.util.ArrayList;

public class LineGraph {

    public ArrayList<Integer> dataArray;

    XYMultipleSeriesDataset dataset;
    XYMultipleSeriesRenderer renderer;
    public static boolean ClickEnabled = true;

    public Intent getIntent(Context context) {

        ArrayList<Integer> y = this.dataArray;

        XYSeries seriesY = new XYSeries("Y");
        for (int i = 0; i < y.size(); i++) {
            seriesY.add(i, y.get(i));
        }
        dataset = new XYMultipleSeriesDataset();
        dataset.addSeries(seriesY);

        renderer.setPanEnabled(true, false);
        renderer.setClickEnabled(ClickEnabled);
        renderer.setBackgroundColor(Color.WHITE);
        renderer.setApplyBackgroundColor(true);
        renderer.setChartTitle("Simple data");
        renderer.setAxesColor(Color.BLACK);
        XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
        XYSeriesRenderer renderer = new XYSeriesRenderer();
        renderer.setColor(Color.RED);
        renderer.setPointStyle(PointStyle.DIAMOND);
        mRenderer.addSeriesRenderer(renderer);

        Intent intent = ChartFactory.getLineChartIntent(context, dataset, mRenderer, "Line Graph Title");
        return intent;
    }

    public void getData() {
        ParseQuery<ParseObject> query = ParseQuery.getQuery("Counters_data");
        query.getInBackground("lxFzCTeOcl", new GetCallback<ParseObject>() {
            public void done(ParseObject parseObject, ParseException e) {

                if (e == null) {
                    String object = parseObject.getString("value");
                    Integer objectValue = Integer.parseInt(object);
                    if (dataArray == null) {
                        dataArray = new ArrayList<Integer>();
                        dataArray.add(objectValue);
                    }
                } else {
                    Log.d("score", "Error: " + e.getMessage());
                }
            }
        });
    }
}
извлекает данные асинхронно.
public void lineGraphHandler(View view) {
        LineGraph line = new LineGraph();
        line.getData();
        Intent lineIntent = line.getIntent(this);
        startActivity(lineIntent);
    }
не будет инициализирован сразу при вызове
<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/counters"
        android:onClick="lineGraphHandler"
        android:text="Charts"
        android:id="@+id/charts"/>
.

public void done(ParseObject parseObject, ParseException e) {

                if (e == null) {
                    String object = parseObject.getString("value");
                    Integer objectValue = Integer.parseInt(object);
                    if (dataArray == null) {
                        dataArray = new ArrayList<Integer>();
                        dataArray.add(objectValue);

                        ArrayList<Integer> y = dataArray;
                        XYSeries seriesY = new XYSeries("Y");
                        for (int i = 0; i < y.size(); i++) {
                            seriesY.add(i, y.get(i));

                            dataset = new XYMultipleSeriesDataset();
                            dataset.addSeries(seriesY);
                        }

                    }

person MaD    schedule 25.03.2014    source источник
comment
03-26 08:42:13.096 1229-1229/com.example.tst D/dalvikvm﹕ Позднее включение CheckJNI 03-26 08:42:13.487 1229-1229/com.example.tst D/libEGL﹕ загружено /system/ lib/egl/libEGL_genymotion.so 03-26 08:42:13.491 1229-1229/com.example.tst D/﹕ HostConnection::get() Новое соединение с хостом установлено 0xb94f4270, tid 1229 03-26 08:42:13.551 1229 -1229/com.example.tst D/libEGL﹕ загружен /system/lib/egl/libGLESv1_CM_genymotion.so 03-26 08:42:13.551 1229-1229/com.example.tst D/libEGL﹕ загружен /system/lib/ egl/libGLESv2_genymotion.so 03-26 08:42:14.035 1229-1229/com.example.tst W/EGL_genymotion﹕ eglSurfaceAttrib не реализовано 03-26 08:42:14.039 1229-1229/com.example.tst E/OpenGLRenderer﹕ Получение MAX_TEXTURE_SIZE из GradienCache 03-26 08:42:14.043 1229-1229/com.example.tst E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 4096 03-26 08:42:14.055 1229-1229/com.example.tst Получение E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE от Caches::initConstraints() 03-26 08:42:14.063 1229-1229/com.example.tst E/Открыть GLRenderer﹕ MAX_TEXTURE_SIZE: 4096 03-26 08:42:14.063 1229-1229/com.example.tst D/OpenGLRenderer﹕ Включение режима отладки 0 03-26 08:42:50.327 1229-1229/com.example.tst D/dalvikvm ﹕ GC_FOR_ALLOC освобождено 200 КБ, 8 % свободно 2975 КБ/3228 КБ, пауза 10 мс, всего 13 мс 03–26 08:42:51.675 1229–1229/com.example.tst D/dalvikvm﹕ GC_FOR_ALLOC освобождено 431 КБ, 14 % свободно 3056 КБ/35 22 мс, всего 28 мс 03-26 08:42:52.043 1229-1229/com.example.tst W/EGL_genymotion﹕ eglSurfaceAttrib не реализовано 03-26 08:42:53.543 1229-1229/com.example.tst I/Choreographer﹕ Пропущено 89 кадров! Приложение может выполнять слишком много работы в своем основном потоке. 03-26 08:43:01.747 1229-1229/com.example.tst D/AndroidRuntime﹕ Завершение работы виртуальной машины 03-26 08:43:01.747 1229-1229/com.example.tst W/dalvikvm﹕ threadid=1: thread выход с необработанным исключением (группа = 0xa4d8fb20) 03-26 08:43:01.767 1229-1229/com.example.tst E/AndroidRuntime﹕ НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.tst, PID: 1229 java.lang.IllegalStateException : Не удалось выполнить метод действия в android.view.View$1.onClick(View.java:3823) в android.view.View.performClick(View.java:4438) в android.view.View$PerformClick.run( View.java:18422) в android.os.Handler.handleCallback(Handler.java:733) в android.os.Handler.dispatchMessage(Handler.java:95) в android.os.Looper.loop(Looper.java:136) ) в android.app.ActivityThread.main(ActivityThread.java:5017) в java.lang.reflect.Method.invokeNative(собственный метод) в java.lang.reflect. Method.invoke(Method.java:515) в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) в dalvik.system.NativeStart.main(собственный метод) Вызвано: java.lang.reflect.InvocationTargetException в java.lang.reflect.Method.invokeNative(собственный метод) в java.lang.reflect.Method.invoke(Method.java :515) в android.view.View$1.onClick(View.java:3818) в android.view.View.performClick(View.java:4438) в android.view.View$PerformClick.run(View.java:18422) ) в android.os.Handler.handleCallback(Handler.java:733) в android.os.Handler.dispatchMessage(Handler.java:95) в android.os.Looper.loop(Looper.java:136) в android.app .ActivityThread.main(ActivityThread.java:5017)
в java.lang.reflect.Method.invokeNative(собственный метод) в java.lang.reflect.Method.invoke(Method.java:515) в c om.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
на dalvik.system.NativeStart.main (Собственный метод) Вызвано: java.lang.NullPointerException в com.example.tst.LineGraph.getIntent(LineGraph.java:36) в com.example.tst.MainActivity.lineGraphHandler(MainActivity.java:44)
в java.lang.reflect.Method.invokeNative(собственный метод) в java.lang.reflect.Method.invoke(Method.java:515) в android.view.View$1.onClick(View.java:3818) в android.view .View.performClick(View.java:4438) в android.view.View$PerformClick.run(View.java:18422) в android.os.Handler.handleCallback(Handler.java:733) в android.os.Handler. dispatchMessage(Handler.java:95) в android.os.Looper.loop(Looper.java:136) в android.app.ActivityThread.main(ActivityThread.java:5017)
в java.lang.reflect.Meth od.invokeNative(собственный метод) на java.lang.reflect.Method.invoke(Method.java:515) на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) на com.android. internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(собственный метод) 03-26 08:43:04.507 1229-1229/com.example.tst I/Process﹕ Отправка сигнала. PID: 1229 SIG: 9   -  person keshav    schedule 26.03.2014


Ответы (1)


arrow_upward
1
arrow_downward

Дождитесь завершения асинхронной операции, прежде чем использовать там данные. Например, вызовите код, требующий эти данные из обратного вызова done().

можешь показать свой логкэт?

person laalto    schedule 26.03.2014