2017-04-25 16 views
0

現在、私はarduinoからBluetoothモジュールを介してセンサー値を受信して​​おり、Androidの画面で常時監視しています。しかし、値が "。"のときに特定のコードを実行したい少なくとも7秒間これを維持する。私はpostDelayedメソッドを使用して、7秒後にsensor0変数の値を取得して確認しました。それでも同じ場合は、特定のコードを実行する必要があります。しかし、エラーコードjava.lang.StringIndexOutOfBoundsExceptionで特定の遅延後にアプリケーションがクラッシュします。遅れて実行しようとするとアプリケーションがクラッシュする

if (msg.what == handlerState) {          //if message is what we want 
        String readMessage = (String) msg.obj;                // msg.arg1 = bytes from connect thread 
        recDataString.append(readMessage);         //keep appending to string until ~ 
        int endOfLineIndex = recDataString.indexOf("~");     // determine the end-of-line 
        if (endOfLineIndex > 0) {           // make sure there data before ~ 
         String dataInPrint = recDataString.substring(0, endOfLineIndex); // extract string 
         txtString.setText("Data Received = " + dataInPrint); 
         int dataLength = dataInPrint.length();       //get length of data received 
         txtStringLength.setText("String Length = " + String.valueOf(dataLength)); 

         if (recDataString.charAt(0) == '#')        //if it starts with # we know it is what we are looking for 
         { 
          sensor0 = recDataString.substring(1, 2);    //get sensor value from string between indices 1-5 

          sensorView0.setText(" What We Got Is: " + sensor0 + "");//update the textviews with sensor values 

          if (sensor0.equals(".")) { 
           Toast.makeText(getApplicationContext(), "Value of sensor0 is: " + sensor0, Toast.LENGTH_SHORT).show(); 
//        Intent i = new Intent(MainActivity.this, UltimateActivity.class); 
//        startActivity(i); 
           final Handler handler = new Handler(); 
           handler.postDelayed(new Runnable() { 
            @Override 
            public void run() { 
             // Do something after 7s = 7000ms 
             sensor0 = recDataString.substring(1, 2); 
             if (sensor0.equals(".")){ 
              Toast.makeText(getApplicationContext(), "Value matched... ", Toast.LENGTH_SHORT).show(); 
             } 
             else{ 
              Toast.makeText(getApplicationContext(), "Current value of sensor0 is: " + sensor0, Toast.LENGTH_SHORT).show(); 
             } 
            } 
           }, 7000); 
          } 

         } 
         recDataString.delete(0, recDataString.length());     //clear all string data 
         // strIncom =" "; 
         dataInPrint = " "; 
        } 
       } 

私はpostDelayedメソッド内sensor0変数は文字列値を見つけることができなかったと思います。しかし、どこにエラーがあるのか​​正確には分かりません。ここで

はlogcatです:

04-25 22:25:17.938 31584-31584/com.example.sparker.bluetoothintegrate E/AndroidRuntime: FATAL EXCEPTION: main 
                         Process: com.example.sparker.bluetoothintegrate, PID: 31584 
                         java.lang.StringIndexOutOfBoundsException: length=0; regionStart=1; regionLength=1 
                          at java.lang.AbstractStringBuilder.startEndAndLength(AbstractStringBuilder.java:211) 
                          at java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:616) 
                          at java.lang.StringBuilder.substring(StringBuilder.java) 
                          at com.example.sparker.bluetoothintegrate.MainActivity$1$1.run(MainActivity.java:93) 
                          at android.os.Handler.handleCallback(Handler.java:815) 
                          at android.os.Handler.dispatchMessage(Handler.java:104) 
                          at android.os.Looper.loop(Looper.java:207) 
                          at android.app.ActivityThread.main(ActivityThread.java:5769) 
                          at java.lang.reflect.Method.invoke(Native Method) 
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 

答えて

0

あなたの実行可能をスケジュールした後は、StringBuilderの内容を削除します。

recDataString.delete(0, recDataString.length()); //clear all string data 

これはRunnableを内部StringBuilder.substringへの呼び出しが境界内にないことを意味しますバッファの(0のサイズを持っています)

+0

これで問題を解決する方法を教えてください。 –

+0

毎回更新された文字列値を取得できるように、その行が必要です。更新されたsensor0の値がどのように格納されるかを削除しないのですか? –

関連する問題