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)


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

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

person laalto    schedule 26.03.2014