2010-12-02 3 views
4

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

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

Я знаю о addJavaScriptInterface, и мне удалось передать отдельные значения от моей деятельности в 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 не будет работать на этих двух предупреждений заявления, заявив:

ERROR/Web Console(2455): Uncaught TypeError: Cannot read property 'length' of undefined at file:///android_asset/chart.html:15

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

+0

ну, да ... Я думаю, вам придется разбирать строку и воссоздавать массив в JS. Но, я не понимаю, почему это была бы такая проблема? – LambergaR 2010-12-02 02:27:50

ответ

0

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

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

5

Remove the line: alert("DataReceived: " + myData.length);