2011-01-25 1 views
0

У меня есть клиент TCP, работающий на телефоне Android. Он подключает и принимает данные из приложения Windows. Когда я получаю сообщение, я разбираю его, и я пытаюсь отобразить изображение. Я должен продолжать проверять новые сообщения из этого приложения Windows.TCP-клиент в Android-телефоне: работает непрерывно, отображает изображение на основе сообщения, полученного от сервера

Поток клиентов продолжает работать. Когда сообщение получено, я передаю его основному действию, проанализирую его, но я не могу отобразить изображение. Я хочу, чтобы клиент проверял новое сообщение каждые 100 мс. В настоящий момент LogCat наводняется, когда поток продолжает работать, и я не могу видеть содержимое LogCat.

В основном я хочу запустить клиент, следить за новыми сообщениями каждые 100 мс, когда появляется новое сообщение, передать его в основное действие, проанализировать его и отобразить изображение. Пожалуйста, ознакомьтесь с приведенным ниже кодом и предложите любые исправления или лучший подход, если это необходимо.

Код клиента ниже.

Основная деятельность:

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 слушателя вместо Activity и когда сообщение обнаружено, он может открыть Activity, который показывает изображение, которое вы хотите. Это сложнее, но, похоже, оно больше соответствует тому, что традиционно используются для деятельности и услуг, если я правильно понимаю. Я думаю, это зависит от того, как долго происходит ожидание между сообщениями и что происходит, пока пользователь ждет.

 Смежные вопросы

  • Нет связанных вопросов^_^