TCP-клиент в телефоне Android: работает непрерывно, отображать изображение на основе сообщения, полученного с сервера - PullRequest
0 голосов
/ 26 января 2011

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

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

1 голос
/ 27 января 2011

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

...