2012-06-28 1 views
1

Я не лучший программист, на самом деле, я довольно плохо :( Мне нужна помощь с чем-то, что сводит меня с ума. В основном у меня есть процесс tcpdump, я хочу извлечь вывод и поместить его в текстовое представление, которое обновляется каждые несколько миллисекунд, я пробовал все и просто не могу заставить его работать.Как связать вывод процесса с текстовым просмотром и автоматически обновлять его в реальном времени?

У меня нет ошибок и, похоже, работает в фоновом режиме, но отображается только куски текста только после того, как я перехожу к рабочий стол и возврат обратно в приложение, однако он не постоянно обновляет текстовое представление, а иногда зависает и падает.

Я создал простой обработчик, который может без проблем обновлять текстовое изображение простым текстом, но затем я столкнулся основные проблемы g чтобы прочесть этот процесс.

кнопку Begin

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.capture); 

    this.LiveTraffic = (TextView) findViewById(R.id.LiveTraffic); 
    this.CaptureText = (TextView) findViewById(R.id.CaptureText); 
    ((TextView) findViewById(R.id.ipv4)).setText(getLocalIpv4Address()); 
    ((TextView) findViewById(R.id.ipv6)).setText(getLocalIpv6Address()); 


    //Begin button    
    final Button startButton = (Button) findViewById(R.id.start); 
    startButton.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      Toast.makeText(getApplicationContext(), "Now Capturing Packets", Toast.LENGTH_LONG).show(); 
      try { 

       process = Runtime.getRuntime().exec("su"); 
       DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
       os.writeBytes("/data/local/tcpdump -q\n"); 
       os.flush(); 
       os.writeBytes("exit\n"); 
       os.flush(); 
       os.close(); 

       inputStream = new DataInputStream(process.getInputStream()); 

       Thread.sleep(1000); 
       Process process2 = Runtime.getRuntime().exec("ps tcpdump"); 

       DataInputStream in = new DataInputStream(process2.getInputStream()); 
       String temp = in.readLine(); 
       temp = in.readLine(); 
       temp = temp.replaceAll("^root *([0-9]*).*", "$1"); 
       pid = Integer.parseInt(temp); 
       Log.e("MyTemp", "" + pid); 
       process2.destroy(); 

       CaptureActivity.this.thisActivity.CaptureText.setText("Active"); 
      } catch (Exception e) { 
      } 
      ListenThread thread = new ListenThread(new BufferedReader(new InputStreamReader(inputStream))); 
      thread.start(); 
     } 
    }); 
} 

класс ListenThread

public class ListenThread extends Thread { 

    public ListenThread(BufferedReader reader) { 
     this.reader = reader; 
    } 
    private BufferedReader reader = null; 

    @Override 
    public void run() { 

     reader = new BufferedReader(new InputStreamReader(inputStream)); 
     while (true) { 
      try { 
       CaptureActivity.this.thisActivity.CaptureText.setText("exec"); 
       int a = 1; 
       String received = reader.readLine(); 
       while (a == 1) { 
        CaptureActivity.this.thisActivity.LiveTraffic.append(received); 
        CaptureActivity.this.thisActivity.LiveTraffic.append("\n"); 
        received = reader.readLine(); 
        CaptureActivity.this.thisActivity.CaptureText.setText("in loop"); 

       } 
       CaptureActivity.this.thisActivity.CaptureText.setText("out loop"); 

      } catch (Exception e) { 
       Log.e("FSE", "", e); 
      } 
     } 
    } 
} 
+0

«Я пробовал все и просто не могу заставить его работать»: вам нужно быть более конкретным о том, что не работает. Вы получили сообщение об ошибке? Который из? Это не так, как ожидалось? и т. д. – assylias

+0

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

+0

Я создал простой обработчик, который может без проблем обновлять текстовое представление простым текстом, но затем я столкнулся с серьезными проблемами, которые заставили его прочитать процесс :( – user1488049

ответ

1

Я не андроидом эксперт, но я заметил, что:

  • вы работаете операции ввода/вывода в потоке пользовательского интерфейса - это будет fr eeze ваш графический интерфейс до завершения операции ввода-вывода ==> запустить их в отдельном потоке.
  • обновить пользовательский интерфейс со стороны потока пользовательского интерфейса в ListenThread, что может привести к неожиданным результатам

Вы можете прочитать об этом в this tutorial (убедитесь, что вы читали 2 примера как первый один сломан (нарочно)).

EDIT
В заключение вы должны иметь что-то вроде этого в первой части кода:

startButton.setOnClickListener(new OnClickListener() { 

    public void onClick(View v) { 
     Toast.makeText(getApplicationContext(), "Now Capturing Packets", Toast.LENGTH_LONG).show(); 
     new Thread(new Runnable() { 

      public void run() { 
       try { 

        process = Runtime.getRuntime().exec("su"); 
        ... 
        CaptureActivity.this.runOnUiThread(new Runnable() { 
         public void run() { 
          CaptureActivity.this.thisActivity.CaptureText.setText("Active"); 
         } 
        }); 
       } catch (Exception e) { 
       } 
       ListenThread thread = new ListenThread(new BufferedReader(new InputStreamReader(inputStream))); 
       thread.start(); 
      } 
     }).start(); 
    } 
}); 

и во втором:

while (true) { 
     try { 
      CaptureActivity.this.runOnUiThread(new Runnable() { 

       public void run() { 
        CaptureActivity.this.thisActivity.CaptureText.setText("exec"); 
       } 
      }); 

      int a = 1; 
      String received = reader.readLine(); 
      while (a == 1) { 
       CaptureActivity.this.runOnUiThread(new Runnable() { 

        public void run() { 
         CaptureActivity.this.thisActivity.LiveTraffic.append(received); 
         CaptureActivity.this.thisActivity.LiveTraffic.append("\n"); 
         CaptureActivity.this.thisActivity.CaptureText.setText("in loop"); 
        } 
       }); 
       received = reader.readLine(); 
      } 
      CaptureActivity.this.runOnUiThread(new Runnable() { 

       public void run() { 
        CaptureActivity.this.thisActivity.CaptureText.setText("out loop"); 
       } 
      }); 

     } catch (Exception e) { 
      Log.e("FSE", "", e); 
     } 
    } 

Это должно решить специфическое взаимодействие пользовательского интерфейса вопрос. Но в вашем коде есть другие логические проблемы, которые выходят за рамки этого вопроса (например, тот факт, что вы никогда не проверяете, достигли ли вы конца файла, который вы читаете, тот факт, что while (a == 1) является бесконечным циклом потому что вы никогда не меняете значение a и т. д.).

+0

Я следил за учебником, и, представляя его в своем приложении, он, похоже, не работает. Ожидалось :( – user1488049

+0

@ assylias. так что из вашего предложения ответа, в условиях мирян, как бы я мог исправить мои код? еще раз, пожалуйста, извините мою наивность.спасибо – user1488049

+0

@ user1488049 См. мое изменение - отказ от ответственности: я не разработчик Android, поэтому могут быть ошибки, но я думаю, что все должно быть в порядке. – assylias

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