2017-01-15 1 views
0

を聴いたときに、このチュートリアルでは、機能を描画配置する方法:表示することができどこ/例えば、私が正常に説明するようにbluetothシリアルプロトコルを使用して、マイクロコントローラからデータを受信して​​いブルートゥース

http://solderer.tv/data-transfer-between-android-and-arduino-via-bluetooth/

I'amを私がtextViewで受け取った値ですが、グラフの値を表示しようとすると、長さが値に依存する行を追加すると、アプリケーションがクラッシュします。

は、私は、静的な絵を描くことが可能だからアプリが起動したとき、私は自分自身の描画機能を持つOKだと思う:

Bitmap bg = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888); 
canvas = new Canvas(bg); 
Paint paint = new Paint(); 
paint.setColor(Color.parseColor(#6b8728)); 
paint.setXfermode(null); 
canvas.drawLine(x, y, x2, y2, paint); 

のBt多分最後に、私は別の方法を使用する必要があります。

とにかく、これが私の問題です。これらの描画関数をデータリスニングスレッドに実装すると、アプリケーションがクラッシュします。 私は線の描画を行う方法がわかりません。新しいスレッドが必要ですか?(そしてその方法は?)、ペイントは特定の部分で行う必要がありますか?具体的な機能は?...

私の質問がはっきりしていれば幸いです。

ご協力いただきありがとうございます。私の機能を追加する

敬具、

シルヴァン

編集

void beginListenForData() 
    { 


     final Handler handler = new Handler(); 
     final byte delimiter = 10; //This is the ASCII code for a newline character 

     stopWorker = false; 
     readBufferPosition = 0; 
     readBuffer = new byte[1024]; 
     workerThread = new Thread(new Runnable() 
     { 
      public void run() 
      { 
       final TextView t = (TextView)findViewById(R.id.textView); 
       while(!Thread.currentThread().isInterrupted() && !stopWorker) 
       { 

        try 
        { 
         int bytesAvailable = mmInputStream.available(); 
         if(bytesAvailable > 0) 
         { 
          byte[] packetBytes = new byte[bytesAvailable]; 
          mmInputStream.read(packetBytes); 
          for(int i=0;i<bytesAvailable;i++) 
          { 
           byte b = packetBytes[i]; 
           if(b == delimiter) 
           { 
            byte[] encodedBytes = new byte[readBufferPosition]; 
            System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length); 
            final String data = new String(encodedBytes, "US-ASCII"); 
            readBufferPosition = 0; 

            Toast.makeText(MainActivity.this, data, 
              Toast.LENGTH_SHORT).show(); 
            handler.post(new Runnable() 
            { 
             public void run() { 

              t.setText(data); 
              String[] separated = data.split(":"); 
              separated[1].trim(); 

              if ((separated[0].length() != 0)&& (separated[1].length() != 0)) { 
              t.append("\n" + separated[0]); 
              t.append("\n" + separated[1]); 

              t.append("\ntest"); 
              String s_angle = separated[0]; 
              String s_value = separated[1]; 

              final Integer angle = Integer.parseInt(s_angle); 
              final Integer value = Integer.parseInt(s_value)/1000; 
               // Crashing here 
               Paint paint = new Paint(); 
               paint.setColor(Color.parseColor("#6b8728")); 

               int width = canvas.getWidth()/2; 
               int height = canvas.getHeight()/2; 

               canvas.drawLine(width,height,150,50, paint); 



             } 





             } 
            }); 
           } 
           else 
           { 
            readBuffer[readBufferPosition++] = b; 
           } 
          } 
         } 
         else 
         { 
          //t.append(bytesAvailable+"\n"); 
         } 
        } 
        catch (IOException ex) 
        { 
         stopWorker = true; 
        } 
       } 
      } 
     }); 

     workerThread.start(); 
    } 

答えて

0

すべてのUI関連の活動は、/メインスレッドUIで行わなければなりません。これを行う方法の一つ:

new Handler(Looper.getMainLooper()).post(new Runnable() { 
    @Override 
    public void run() { 
     //your UI code goes here 
    } 
}); 
+0

こんにちは、あなたの速い答えをいただき、ありがとうございます。 しかし、まだクラッシュしています。私はpaint変数を定義しているラインでクラッシュしています: –

+0

@SylvainTrx、logtcatからスタックトレースまたはログを提供できますか? –

+0

こんにちは、ありがとうございました。 しかし、まだクラッシュしています。これは、私がペイント変数を定義している行でクラッシュしています。 ペイントペイント=新しいペイント(); 私はすでに新しいハンドラに入っていたので、コードをどこに置くべきかはわかりません。 –

0

私が使用したrunOnUiThread:

runOnUiThread(new Runnable() { 
                @Override 
                public void run() { 
                 Paint paint = new Paint(); 
                 paint.setColor(Color.parseColor("#6b8728")); 
                 //Bitmap bg = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888); 
                 //Canvas canvas = new Canvas(bg); 
                 int width = canvas.getWidth()/2; 
                 int height = canvas.getHeight()/2; 

                 canvas.drawLine(width, height, 150, 50, paint);   
                } 
               }); 
+0

ところで、私はhuaweiでのログの問題に関してこのスレッドを見つけました: http://stackoverflow.com/questions/18124334/huawei-logcat-not-showing-the-log-for-my-app ダイヤル *#*#2846579#*# と表示され、非表示のメニューが表示されます。プロジェクトメニュー>バックグラウンド設定>ログ設定に移動し、ログの可用性(ログスイッチ)とレベル(ログレベルの設定)を定義します。 –

関連する問題