2011-01-25 22 views
0

AndroidクライアントでTCPクライアントを実行しています。これは、Windowsアプリケーションからデータを送受信します。メッセージを受け取ったら、それを解析してイメージを表示しようとします。私はこのWindowsアプリから新しいメッセージをチェックし続ける必要があります。Android phoneのTCPクライアント:サーバから受信したメッセージに基づいて画像を表示し続けます。

クライアントスレッドは実行を継続します。メッセージが受信されると、それをメインアクティビティに渡して解析しますが、イメージを表示することはできません。私は100ミリ秒ごとにクライアントが新しいメッセージをチェックするようにしたい。現時点では、スレッドが実行され続けるとLogCatが氾濫し、LogCatの内容を実際に見ることができません。

基本的には、新しいメッセージがあるときに新しいメッセージをチェックし、メインのアクティビティに渡してパースしてイメージを表示するように、クライアントを実行します。下記のコードを読んで、必要に応じて修正やより良いアプローチを提案してください。

クライアントコードは以下のとおりです。

主な活動:

public class TCPListen extends Activity implements TCPListener { 
private TextView mTitle; 
public String data[] = new String[2]; 

    /** Called when the activity is first created. */ 
    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      //setContentView(R.layout.main); 

     // Set up the window layout 
      requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
      setContentView(R.layout.main); 
      getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title); 

      // Set up the custom title 
      mTitle = (TextView) findViewById(R.id.title_left_text); 
      mTitle.setText(R.string.app_name); 
      mTitle = (TextView) findViewById(R.id.title_right_text); 

      //TcpServiceHandler handler=new TcpServiceHandler(this); 
      //handler.execute("192.168.62.23"); 

      TcpServiceHandler handler = new TcpServiceHandler(this,this); 
      Thread th = new Thread(handler); 
      th.start(); 
     } 

     public String[] callCompleted(String source){ 
      Log.d("TCP", "Std parser " + source); 
      mTitle.setText(source); 
      //String data[] = new String[2]; 

      //if (source.matches("<MSG><N>.*</N><V>.*</V></MSG>")) { 
       Document doc = null; 
       try{ 
       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
       DocumentBuilder db = dbf.newDocumentBuilder(); 
       doc = (Document) db.parse(new ByteArrayInputStream(source.getBytes())); 
       NodeList n = doc.getElementsByTagName("N"); 
       Node nd = n.item(0); 
       String msgName = nd.getFirstChild().getNodeValue(); 
       NodeList n1 = doc.getElementsByTagName("V"); 
       Node nd1 = n1.item(0); 
       String tmpVal = nd1.getFirstChild().getNodeValue(); 
       data[0] = msgName; 
       data[1] = tmpVal; 
       Log.d("TCP", "Inside Std parser " + data[0] + " " + data[1]); 
       actionOnData(data[0], data[1]); 
       } 
       catch(Exception e){ 
       e.printStackTrace(); 
      } 
      Log.d("TCP", "Just outside Std parser " + data[0] + " " + data[1]); 
      return data; 
      //} else Log.d("TCP", "Message in wrong format " + source); 
      //mTitle.setText("Message in wrong format " + source); 
      //return data; 
     } 


    //Function to display driver messages/images based on individual messages 
     public void actionOnData(String name, String value) { 
     String tempName = name; 
     String tempVal = value; 
     //while (true) { 
     if(tempName.equals("shiftDirection") && tempVal.equals("1")) { 
     Log.d("TCP","in actionOnData " + data[0] + " " + data[1]); 
     mTitle.setText("Change to next higher gear"); 
       Intent myIntent = new Intent(); 
       myIntent.setClassName("com.example.android.TCPListen", "com.example.android.TCPListen.Images"); 
       //myIntent.putExtra("Change gear", "Shift to next gear!"); // key/value pair, where key needs current package prefix. 
       startActivity(myIntent); 
       try { 
       wait(3000); 
       } catch(InterruptedException e) { 
       System.out.println("InterruptedException caught"); 
       } 
      } else if(tempName.equals("vehicleSpeed") && tempVal.equals("120")) { 
     Log.d("TCP","in actionOnData " + data[0] + " " + data[1]); 
     mTitle.setText("Drive like a man"); 
       //Intent myIntent = new Intent(); 
       //myIntent.setClassName("com.example.android.TCPListen", "com.example.android.TCPListen.Images"); 
       ////myIntent.putExtra("Change gear", "Shift to next gear!"); // key/value pair, where key needs current package prefix. 
       //startActivity(myIntent); 
      } else Log.d("TCP", "Just show an image"); 

     //} 

     } 
} 

はインタフェース:

public interface TCPListener { 
public String[] callCompleted(String msg); 
} 

スレッド:あなたはより良いアプローチのための提案を求めているので

public class TcpServiceHandler implements Runnable { 
    TCPListener _listener; 
    private Activity _act; 
    public TcpServiceHandler(TCPListener listener, Activity act){ 
     _listener = listener; 
     _act = act; 
    } 

    public synchronized void run() { 
     // TODO Auto-generated method stub 
     //if(socket==null){ 
      try { 
       //InetAddress serverAddr = InetAddress.getByName("192.168.178.25"); 
       Socket socket = new Socket("192.168.2.103", 1200, true); 
     // 
       while(true){ 
        try { 
         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         final String str = in.readLine(); 
         this._act.runOnUiThread(new Runnable(){ 

         public void run() { 
          _listener.callCompleted(str); 
          } 
         }); 
        } 
        catch(Exception e){ 
         e.printStackTrace(); 
        } 
       } 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
    } 
} 

答えて

1

、あなたがサービスを持っ検討するかもしれないTCP可能リスナーの代わりにアクティビティを開き、メッセージが検出されると、アクティビティを開くことができますあなたが望むイメージ。それはより複雑ですが、私が正しく理解しているならば、アクティビティとサービスが伝統的に使用されているものに合っているようです。私はそれは、ユーザーが待っている間にメッセージがどれくらいの間待っているのか、何が起こっているのかといったものに依存していると思います。

関連する問題