2011-02-01 28 views
1

私は以下のメインクラスとスレッド - TCPクライアントを持っています。クライアントはループで動作し、メッセージを受信して​​メインクラスに渡します。メインクラスでは、メッセージを解析し、受け取ったメッセージの名前と価値に基づいてさまざまなイメージを表示しようとします。 例:shiftDirection1 名:shiftDirection &値:1Android:複数の画像を表示できません

しかし、私は最初に受信されたメッセージと残り受信したメッセージに対応する画像に対応する画像のみを表示することができない示すことができます。

下記のコードを読んで、間違いや問題点や代替方法をお手伝いしてください。

ありがとうございます。

マドゥ

メインクラス:

public class TCPListen extends Activity implements TCPListener { 
    private TextView mTitle; 
    public String recData[] = new String[2]; 
    String PresentGear = "0"; 

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

      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(); 
         recData[0] = msgName; 
         recData[1] = tmpVal; 
         if (recData[0].equals("currGear")) PresentGear = recData[1]; 
         Log.d("TCP", "Inside Std parser " + recData[0] + " " + recData[1]); 
         actionOnData(recData[0], recData[1]); 
         } 
        catch(Exception e){ 
        e.printStackTrace(); 
       }     
       Log.d("TCP", "Just outside Std parser " + recData[0] + " " + recData[1]); 
       return recData; 
       //} 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; 
      setContentView(R.layout.image); 
      ImageView showImage = (ImageView) findViewById(R.id.imageView1); 
      //Log.d("TCP", "------------>" + tempName + " " + tempVal);    

      if (tempName.equals("shiftDirection") && tempVal.equals("1")) { 
       //setContentView(R.layout.image); 
       //TextView text_top = (TextView) findViewById(R.id.textView1); 
       //showImage = (ImageView) findViewById(R.id.imageView1);    
       //text_bottom.setText(Info[1]); 
       showImage.setImageResource(R.drawable.shift_up); 
       Log.d("TCP", "1------------>" + showImage); 
      } else if (tempName.equals("shiftDirection") && tempVal.equals("-1")) {     
       //setContentView(R.layout.image); 
       //TextView text_bottom = (TextView) findViewById(R.id.textView2); 
       //Resources res = getResources(); 
       //Drawable drawable = res.getDrawable(R.drawable.shift_down); 

       //showImage = (ImageView) findViewById(R.id.imageView1);    
       //text_bottom.setText(Info[1]); 
       showImage.setImageResource(R.drawable.shift_down);    
      } else if (tempName.equals("recomGear") && tempVal != null) { 
       Log.d("TCP", "3------------>" + tempName + " " + tempVal); 
       Integer msgValue = Integer.parseInt(recData[1]); 
       //Integer CurrentGear = (msgValue) - 1; 
       //Log.d("TCP","in DA Images. Current gear: " + CurrentGear); 
       //String Gear = Integer.toString(CurrentGear); 
       setContentView(R.layout.image); 
       TextView text_top = (TextView) findViewById(R.id.textView1); 
       TextView text_bottom = (TextView) findViewById(R.id.textView2); 
       showImage = (ImageView) findViewById(R.id.imageView1);   
       showImage.setImageResource(R.drawable.shift_up); 
       text_bottom.setText(PresentGear); 
       text_top.setText(tempVal); 
      } else if (tempName.equals("currGear") && tempVal != null) { 
       Log.d("TCP", "4------------>" + tempName + " " + tempVal); 
       PresentGear = tempVal;   
       //Log.d("TCP","in DA Images. Present gear1: " + PresentGear); 
       setContentView(R.layout.image); 
       TextView text_bottom = (TextView) findViewById(R.id.textView2); 
       text_bottom.setText(PresentGear);      
      } else if (tempName.equals("shiftDirection") && tempVal.equals("0")) { 
       Log.d("TCP", "5------------>" + tempName + " " + tempVal); 
       Log.d("TCP","in DA Images. Present gear: " + PresentGear); 
       setContentView(R.layout.image); 
       TextView text_bottom = (TextView) findViewById(R.id.textView2); 
       //TextView text_top = (TextView) findViewById(R.id.textView1); 
       //text_top.setText("Go on"); 
       text_bottom.setText(PresentGear);   
      }   
      } 
} 

場合のみが表示されている場合は、最初に対応する画像。プログラムコントロールは2番目のifループに入りますが、そこに画像は表示されません。

インタフェース:

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

スレッド(TCPクライアント):

public class TcpServiceHandler implements Runnable { 
    TCPListener _listener;    
    private Activity _act; 
    public BufferedReader in; 
    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.62.23", 1200, true); 
     // 
       //while(true){ 
        try {       
         in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         final int delay = 100; 
         final Timer _timer = new Timer(); 
         _timer.scheduleAtFixedRate(new TimerTask() {      
          public void run(){ 
           String str; 
           try { 
            str = in.readLine(); 
            _listener.callCompleted(str); 
           } catch (IOException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 

          } 
         }, 0, delay); 
         //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

あなたは2つのことをチェックかもしれません:

  1. はあなたのTcpServiceHandlerは、スレッドのRunnableですが、そこにありますrun()のループはありません。このメソッド内で定義した_timerは、処理が完了する前に終了している可能性があります。

  2. あなたはバックグラウンドスレッドからUIを変更していますか?これは一般的には良い考えではありません。

  3. AsyncTask」は、バックグラウンドで操作を実行するのに便利なツールです。

+0

TcpServiceHandlerのタイマーが正常に動作しています。実際、すべての着信メッセージもメインクラスに渡されます。しかし、画像は表示されません。私はバックグラウンドスレッドからUIを変更していないと思います。私は以前に非同期タスクを試みましたが、それは私のためにものを複雑にします。 –

+1

更新プログラムがタイマースレッドで実行されています。 AsyncTaskは、バックグラウンドで発生するものとメインスレッドで発生しなければならないUI更新の間で物事を渡すように設計されています。 IMHOこれはまさにあなたが必要とするものです。独自のHandlerを実装したり、runOnUiThread()を呼び出すことができます(コメントアウトされたコードで試したことだと思います)が、AsyncTaskを再実装するだけです。 – Michael

関連する問題