2013-06-27 95 views
0

我試圖製作一個監視網絡連接的程序,一個顯示狀態和帶寬並每秒刷新一次的程序。昨天我瞭解到,網絡監控發生在我創建的輔助線程上;它現在可以工作。Thread.sleep導致android程序崩潰

我相信每秒鐘都會刷新程序,我做了一個while循環,其中while條件總是「真」,while循環結束時我「嘗試」一個Thread.sleep( 1000)。

我有一個問題和一個問題。

問題:我有可能淹沒我的程序嗎?我覺得通過設置secondaryThread = null,在while循環期間創建的所有數據都會被垃圾回收,但我不確定是否屬於這種情況。

問題:當我運行這個程序時,我收到一條消息:「[程序]已經意外退出」......導致我認爲我的確在淹沒程序。有沒有辦法解決這個問題?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    int linkSpeed = -1; 
    TextView textView = new TextView(this); 
    while (true) 
    { 
     SecondaryThread secondaryThread = new SecondaryThread(this); 
     new Thread(secondaryThread).start(); 
     linkSpeed = secondaryThread.getLinkSpeed(); 
     secondaryThread = null; 

     // Create the text view 
     textView.setTextSize(25); 
     textView.setText("linkspeed = " + linkSpeed); 

     // Set the text view as the activity layout 
     setContentView(textView); 
     try { 
      Thread.sleep(1000); 
     } 
     catch (Exception e) { 
      textView.setTextSize(25); 
      textView.setText("oh shit"); 
     } 
    } 

LogCat跟蹤堆棧說,一切運行良好,即使這不是實際情況。具體來說,它說以下...

06-27 15:07:58.069: D/gralloc_goldfish(1312): Emulator without GPU emulation detected. 
06-27 15:41:45.879: I/dalvikvm(1919): threadid=3: reacting to signal 3 
06-27 15:41:45.958: I/dalvikvm(1919): Wrote stack traces to '/data/anr/traces.txt' 
+0

的logcat的消息(反應信號3,寫堆棧跟蹤)不必然表明一個問題。這僅僅意味着系統中的某些人認爲從過程1919中抓取堆棧跟蹤(可能是ANR檢測器預熱)會很有用。查看日誌中的其他地方,查看過程中死亡的原因 - 搜索最後一次出現的「1919」並查看附近。 – fadden

回答

0

永遠不要阻止UI線程。使用後臺線程:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    final TextView textView = new TextView(this); 

    new AsyncTask<Void, Void, Void>() { 

     @Override 
     protected Void doInBackground(Void... params) { 
      int globalState = 1; 
      while (true) { 
       // <cut> 

       // Create the text view 
       // new scope 
       { 
       final int linkSpeed = ++globalState; 
       textView.post(new Runnable() { 
        @Override 
        public void run() { 
         textView.setTextSize(25); 
         textView.setText("linkspeed = " + linkSpeed); 

         // Set the text view as the activity layout 
         setContentView(textView); 
        } 
       }); 
       } 

       try { 
        Thread.sleep(1000); 
       } catch (Exception e) { 
        textView.post(new Runnable() { 
         @Override 
         public void run() { 
          textView.setTextSize(25); 
          textView.setText("oh XXXX"); 
         } 
        }); 
       } 
      } 
     } 

    }.execute(); 
+0

linkSpeed必須是最終的 - 所以我不認爲這適用於我的代碼;因爲linkSpeed是一個每秒刷新一次的變量。 –

+0

linkSpeed在創建閉包'Runnable(){...}'的範圍內需要是最終的。但是,在輸入範圍之前,沒有任何東西阻止您更新值,或者創建新範圍{...} – tofi9