Android-приложение использует статический метод для передачи и отображения данных - PullRequest
0 голосов
/ 06 июня 2011

Я задавал вопросы, касающиеся моего проекта Android, который постоянно отображает данные Bluetooth в режиме реального времени.

По сути, я уже создал первую версию своего приложения, собрав воедино некоторый открытый исходный код.код Blueterm и OrientationSensorExample

Было предложено добавить поток, обработчик, службу или использовать Async Task, или AIDL и т. д. Но я нене знаю, как их использовать, и был бы признателен за объяснение.

Вот описание открытого исходного кода Blueterm, с которого я начал (см. ссылку выше).Blueterm - это в основном программа-эмулятор терминала, которая общается через Bluetooth.Он состоит из нескольких видов деятельности, причем Blueterm является наиболее важным.Он обнаруживает, связывает и соединяется с удаленным устройством Bluetooth, которое поддерживает SPP / RfComm.После подключения я могу использовать Blueterm для настройки удаленного устройства, посылая ему команды для включения выборки, изменения количества каналов для выборки (на один канал), изменения формата входных данных (мне нравятся данные, разделенные запятыми) и т. Д.

Вот описание открытого исходного кода OrientationSensorExample, с которого я начал (см. Ссылку выше).Это в основном пример приложения библиотеки AnroidPlot.Деятельность OrientationSensor реализует SensorEventListener.Это включает переопределение onSenorChanged (), которое вызывается всякий раз, когда берутся новые данные датчика ориентации, и перерисовывает график.

Объединяя эти два проекта с открытым исходным кодом (Blueterm и OrientationSensorExample) в одно приложение (Blueterm), вотописание того, как работает общее приложение (Blueterm).Когда я запускаю Blueterm, весь экран эмулирует красивый синий терминал.В открывшемся меню «Параметры» выполните сопряжение, подключитесь и настройте удаленное устройство Bluetooth, как описано выше.После того, как я настроил удаленное устройство, я снова захожу в меню параметров и выбираю «Данные графика», который запускает действие «График».Эмулятор терминала исчезает, и появляется хороший прокручиваемый график в реальном времени из действия Plot.

Насколько я могу судить, существует фоновый поток, который вызывает метод update () следующим образом:

/**
 * Look for new input from the ptty, send it to the terminal emulator.
 */
private void update() {
    int bytesAvailable = mByteQueue.getBytesAvailable();
    int bytesToRead = Math.min(bytesAvailable, mReceiveBuffer.length);
    try {
        int bytesRead = mByteQueue.read(mReceiveBuffer, 0, bytesToRead);
        append(mReceiveBuffer, 0, bytesRead);

        //VTR use existing handler that calls update() to get data into plotting activity
        Plot.plotData(mReceiveBuffer, 0, bytesRead);

    } catch (InterruptedException e) {
        //VTR OMG their swallowing this exception
    }
}

В методе update () мне было удобно вызывать мой метод Plot.plotData () и передавать ему ту же дату, которая передается методу append () для построения графика данных.ПРИМЕЧАНИЕ. Это работает, только если plotData () является статическим методом.Никто не смог объяснить, почему.

В любом случае plotData () - это статический метод, и вот как он и его вспомогательные методы выглядят сейчас:

private static StringBuffer strData = new StringBuffer("");
public static void plotData(byte[] buffer, int base, int length) {

    Log.i("Entering: ", "plotData()");

    /*
    byte[] buffer = (byte[]) msg.obj;
    int base = msg.arg1;
    int length = msg.arg2;
    */

    for (int i = 0; i < length; i++) {
        byte b = buffer[base + i];
        try {
            if (true) {
                char printableB = (char) b;
                if (b < 32 || b > 126) {
                    printableB = ' ';
                }
                Log.w("Log_plotData", "'" + Character.toString(printableB)
                        + "' (" + Integer.toString(b) + ")");

                strData.append(Character.toString(printableB));
                if (b == 10)
                {
                    Log.i("End of line: ", "processBlueData()");
                    Log.i("strData", strData.toString());
                    splitData(strData);
                    strData = new StringBuffer("");
                }
            }
        } catch (Exception e) {
            Log.e("Log_plotData_exception", "Exception while processing character "
                    + Integer.toString(i) + " code "
                    + Integer.toString(b), e);
        }
    }

    Log.i("Leaving: ", "plotData()");
}

private static void splitData(StringBuffer strBuf) {
    String strDash = strBuf.toString().trim();
    String[] strDashSplit = strDash.split("-");
    for (int ndx = 0; ndx < strDashSplit.length; ndx++)
    {
        if (strDashSplit[ndx].length() > 0)
            Log.i("strDashSplit", ndx + ":" + strDashSplit[ndx]);
        String strComma = strDashSplit[ndx].trim();
        String[] strCommaSplit = strComma.split(",");
        for (int mdx = 0; mdx < strCommaSplit.length; mdx++)
        {
            if (strCommaSplit[mdx].length() > 0)
                Log.i("strCommaSplit", mdx + ":" + strCommaSplit[mdx]);
            if (mdx == 1)
            {
                int raw = Integer.parseInt(strCommaSplit[1],16);
                Log.i("raw", Integer.toString(raw));
                float rawFloat = raw;
                Log.i("rawFloat", Float.toString(rawFloat));
                float ratio = (float) (rawFloat/65535.0);
                Log.i("ratio", Float.toString(ratio));
                float voltage = (float) (5.0*ratio);
                Log.i("voltage", Float.toString(voltage));
                nowPlotData(voltage);
            }
        }
    }
}

public static void nowPlotData(float data) {

    // get rid the oldest sample in history:
    if (plotHistory.size() > HISTORY_SIZE) {
        plotHistory.removeFirst();
    }

    // add the latest history sample:
    plotHistory.addLast(data);

    // update the plot with the updated history Lists:
    plotHistorySeries.setModel(plotHistory, SimpleXYSeries.ArrayFormat.Y_VALS_ONLY);

    //VTR null pointer exception?
    if (plotHistoryPlot == null)
        Log.i("aprHistoryPlot", "null pointer exception");

    // redraw the Plots:
    plotHistoryPlot.redraw();
}

Если настоятельно рекомендуется plotData() не быть статическим методом, и что я должен сделать что-то еще, пожалуйста, объясните здесь и как.Спасибо!

1 Ответ

2 голосов
/ 06 июня 2011

Возможно, этот вопрос лучше подходит для Code Review , чем здесь.Возможно, вы можете переформулировать, чтобы опубликовать его там, или много обрезать, чтобы опубликовать его здесь.

Кроме того, чтобы ответить: «Было предложено добавить поток, обработчик, Сервис или использовать Async Taskили AIDL и т. д. Но я не знаю, как использовать любой из них, и был бы признателен за объяснение. ", лучший совет - связать вас с книгой об Android, например: http://commonsware.com/Android/.Главы 35 и 36 посвящены услугам, а глава 20 - о потоках.Вы никогда не получите такого полного ответа, как эти главы здесь.

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