2012-03-20 1 views
0

私の目的は、ネットワーク上のスレッドにパスの座標を送信することができましたが、2つ目のデバイスでこれらを処理できません。ストリームからの座標を可能な限りリアルタイムで使用して、どのように第2のデバイス上にパスを描くのでしょうか。オブジェクトストリームをキャンバス

public class connecting implements Runnable{ 

    Socket sock; 
    ObjectInputStream ois; 

    @Override 
    public void run() { 

     try{ 
      sock = new Socket("10.42.34.46", 1337);   
      InputStream is = sock.getInputStream(); 
      ois = new ObjectInputStream(new BufferedInputStream(is)); 


     }catch(IOException ex){ 
      ex.printStackTrace(); 
     } 

     while(true){ 
      com.DrawTastic.Drawring serverDraw = null; 

      serverDraw = (com.DrawTastic.Drawring) ois.readObject(); 

      float mX = serverDraw.getMx(); 
      float mY = serverDraw.getMy(); 


     } 
    } 

} 

がどのように私は、フロート変数が連続して別のスレッドのJavaクライアント/サーバープログラミングについて

@Override 
    public void onDraw(Canvas canvas) { 

     connecting ncoords = new connecting(); 
     mPath.lineTo(mX, mY); 

     canvas.drawPath(mPath, mPaint); 
     canvas.drawColor(Color.WHITE); 

     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, mPaint); 
    } 
} 

答えて

2

This is the most basic tutorialこのonDrawメソッドに描画するためになるだろう:現在、私は、ねじ接続を持っています。さんは

  • クライアントは、実際のタッチイベントデバイスがクライアントによってもたらさイベントを聴いている
  • サーバとの対話デバイスである命名を見てみましょう

クライアントを実装onTouchEvent(MotionEvent)とソケットのOutputStreamにx座標とy座標を書き込みます。できるだけリアルタイムにしたい場合でも、イベント(x、y、タイムスタンプ)をローカルに保存し、特定の時間間隔で送信する必要があります。他のブロッキング操作と同様に、これはメインのアプリケーションスレッドとは別のスレッドで実行されます。これは、イベントをリスニングServerSocketを持つことになり、疑似実装

ClientActivity 
    thread: 
    while activity_is_running: 
     sleep 100 
     socket.write list_of_events 

    onCreate(): start_background_thread 
    onViewTouched(): thread.add_event 

サーバーです。イベントが受け取られるたびに、それが描画されます。ソケットがリッスンしているバックグラウンドスレッドから描画スレッドにアクセスするには、Handlerを使用することができます。ハンドラは、単に特定のスレッドでいくつかのコードを実行する方法です。 ServerActivityのインスタンス変数をHandlerと宣言し、onCreateにインスタンス化する必要があります。HandlerはUIスレッドでもあるアプリケーションのメインスレッドにバインドされます。

ServerActivity 
    thread: 
    while activity_is_running: 
     handler.draw socket.get_event_from_input_stream 

    onCreate(): 
    handler: new Handler() 
    start_background_thread 

最後の部分は、クライアント側とサーバー側の両方ですでに描画されたものを覚えておく方法です。これは、onDrawを呼び出すたびにきれいなビットマップが得られるため、各イベントをリストに格納してそのリストから描画するか、既に描画されたもののキャッシュを保持する必要があります(see this paste