Передача массива значений из Android Activity в JavaScript в WebView - PullRequest
4 голосов
/ 02 декабря 2010

Я использую библиотеку JS Charts для рисования графиков в WebView моего приложения для Android.Я хочу предоставить данные из базы данных SQLite.На данный момент я застрял на том, как передать массив данных из Java в JavaScript.Часть JavaScript ожидает что-то вроде этого:

data = new Array([10, 10], [20, 10]);

Я знаю о addJavaScriptInterface, и мне удалось передать отдельные значения из моего Activity в WebView.Это только массив, который доставляет мне неприятности.Я думал о чем-то вроде этого:

final class ChartDataLoader {

    public double[][] getData() {
        double[][] data = {{10, 10}, {20, 10}};
        return data;
    }
}

Обратите внимание, что сейчас я просто жестко кодирую данные, но в конечном итоге это будет извлечено из базы данных.Итак, я открываю это для своего JS:

webView.addJavascriptInterface(new ChartDataLoader(), "dataLoader");

И, наконец, пытаюсь прочитать его на JavaScript:

<html>
<head>
<script type="text/javascript" src="jscharts.js"></script>
</head>

<body>
<div id="chartcontainer">You should see a chart here.</div>

<script type="text/javascript">

 myData = dataLoader.getData(); 
 alert("DataReceived: " + myData.length);
 alert("Element 0 : " + myData[0]);

 var myChart = new JSChart('chartcontainer', 'line');
 myChart.setDataArray(myData);
 myChart.draw();

</script>
</body>
</html>

Сбой JavaScript в этих двух операторах оповещения с указанием:

ОШИБКА / Веб-консоль (2455): Uncaught TypeError: Невозможно прочитать свойство 'length' с неопределенным значением в файле: ///android_asset/chart.html: 15

Есть подсказки?Я видел в Интернете некоторый код, где другие люди конвертируют массивы в строку, а затем воссоздают его обратно в JavaScript, но мне это кажется излишним, и я надеялся на лучшее решение.Альтернативой является передача файла XML в библиотеку диаграмм, но, опять же, я думал, что будет медленно создавать новый XML каждый раз, когда пользователь хочет увидеть график.

Ответы [ 2 ]

5 голосов
/ 12 ноября 2012

Удалить строку: alert ("DataReceived:" + myData.length);

0 голосов
/ 02 декабря 2010

Чтобы исправить самую последнюю ошибку, вам нужно определить myData как переменную.

В конце вопроса (о преобразовании массивов в строку) вы говорите о JSON. Любое переключение контекста обходится дорого (например, Android на веб). Сериализация / десериализация, вероятно, не сильно замедлит вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...