2011-10-05 52 views
2

這是我的問題。我正在編寫一個android應用程序,它需要顯示它正在運行的活動的時間。爲此,我創建了一個新的線程,該線程從活動中調用。但是,當我在模擬器中啓動應用程序時,似乎Activity從不加載。也許你們可以在這裏幫助我。這裏是相關的代碼:以線程更新UI活動

public class ActivityStartTracker extends ActivityBasic { 
    TimerThread timer; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.start); 
     timer = new TimerThread(); 
    } 

    protected void onResume() { 
     super.onResume(); 
     registerReceiver(broadcastReceiver, new IntentFilter(
       ServiceLocator.BROADCAST_ACTION)); 
     timer.run(); 
    } 

    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(broadcastReceiver); 
     if (timer.isRunning()) { 
      timer.interrupt(); 
     } 
    } 

    class TimerThread extends Thread { 
     boolean isRunning = false; 

     public TimerThread() { 
     } 

     @Override 
     public void run() { 
      int seconds = 0; 
      isRunning = true; 
      while (isRunning) { 
       try { 
        Log.d(TAG, "Timer is running for : " + seconds); 
        seconds++; 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        isRunning = false; 
       } 
      } 
     } 

     public boolean isRunning() { 
      return isRunning; 
     } 
    } 
} 

就像我說的,這些是相關的代碼片段。 問題是,如果我運行這個,活動保持黑色 - 我只是得到與應用程序的名稱頭,這就是所有。通過日誌記錄,我可以確認線程正在運行,但沒有其他顯示。

你可以請我幫忙,我對android比較陌生。
非常感謝 - 已經提前。

+1

hy!我沒有看到你更改gui的代碼?我想要在線程中更新gui,您必須使用'runOnUIThread()' – test123123

+0

那是真的 - 在我嘗試添加顯示定時器的新功能之前,GUI工作正常 - 因此我想我可以刪除所有findView()和setText()方法。我只是想展示問題的核心 - 所以你們不必讀取所有不必要的代碼行。 – Daniel

回答

0

保持你記住,可以更新UI的唯一線程是UIThread

所以,如果你想修改另一個線程的UI,你應該方法:runOnUIThread()

,但是當你有一個線程,將更新UI,最好的辦法是使用AsyncTask;請參考this

1

調用計時器#run()會做到這一點,調用UI線程中的#run()方法。你需要通過調用#start()來啓動你的線程 - 然後新線程將做你的期望。

進一步:永遠不要調用Thread#start()兩次,它實際上不會重新啓動線程,只會導致應用程序崩潰。如果你打算從你的onResume開始線程,你需要在那裏分配一個新的線程。

順便說一句,考慮使用AsyncTask代替。

BR, 延

+0

我也想到了AsyncTask,但是它是用來顯示活動正在運行的秒數,我無法弄清楚如何使AsynTask在while() - loop循環中運行,然後將它休眠一秒鐘。順便說一句...感謝您的快速幫助 - 它的工作原理。 – Daniel

+0

處理程序適用於定時器。 http://developer.android.com/reference/android/os/Handler.html – Pramod