2012-01-10 19 views
1

我有兩個活動,一個是主要的,我有一個名爲測試以及的android:如何將文本追加到TextView的另一個動作每2秒

在主要活動我有一個按鈕,當我點擊另一個活動這個按鈕我去測試活動

在測試活動我想申請到一些文本自動追加到TextView的,它具有每10秒

這段文字可以是例如「測試」 所以每10秒「測試」將被添加 但是,當我離開活動並去到主要活動,這個過程將繼續發生 因此,如果例如我花了20秒的主要活動,然後返回到測試活動,我會在文本視圖中看到兩個更多的「測試」字符串..

I試圖與TimerTask的這樣做的,必須不惜一切

沒有成功,這是測試活動的代碼,在主要活動我只是有一個顯示我的其他活動

public class test2 extends Activity { 
    /** Called when the activity is first created. */ 

    private TimerTask task; 
    private Handler handler; 
    private TextView tv; 
    private Timer t; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.text1); 

     t = new Timer(); 
     task = new TimerTask() { 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() { 
         TextView tv = (TextView) findViewById(R.id.tv1); 
         tv.append("test"); 

        } 
       }); 

      } 
     }; 
     t.schedule(task, 2000); 
    } 
} 

當我在按鈕單擊該按鈕主要活動爲了去測試活動我得到以下錯誤:

   FATAL EXCEPTION: Timer-0 
       java.lang.NullPointerException 

在此先感謝

+0

''處理程序'初始化在你提供的代碼片段中沒有看到的地方嗎? – harism 2012-01-10 23:08:26

+0

哈里斯,你是對的,但現在它只是顯示第一個「測試」字符串,沒有別的... – js2 2012-01-10 23:14:32

+0

Timer.scheduleAtFixedRate(..)也許你正在尋找如果你想讓它重複固定間隔。請記住,在Activity被銷燬之前取消它的執行,比如Activity.onDestroy()。但正如約翰指出的那樣,我不確定這是否是一種你以後的做法。 – harism 2012-01-10 23:21:07

回答

1

如果你想實現從後臺更新視圖的方式,我建議切換到使用Service而是用定時器可能週期性地發送廣播,其中主活動可以通過BroadcastReceiver訪問。 TimerTask可以在後臺服務開始時執行。

如果您想要在加載時立即更新測試類,則可以在該服務上實現「更新」BroadcastReceiver,其功能是使用更新後的值發送另一個廣播。

這樣,當您在活動之間切換時(如果這就是您要做的),您無需擔心測試活動暫停。

編輯:

這裏是應該有你需要的一切一個很好的教程:

http://www.vogella.de/articles/AndroidServices/article.html

+0

嗨約翰謝謝你的答案,你有任何類似的事情嗎? – js2 2012-01-10 23:23:02

+0

嗨js2,我用適合你的帖子的教程更新了我的答案。 – 2012-01-10 23:35:01

+0

+1在這種情況下,服務是最合理的方法IMO。 – yorkw 2012-01-10 23:54:54

0

不知情其中應用程序崩潰(的代碼,其中即行拋出nullPointerException)所有的答案都不是很精確。

這就是我想你的問題:

你打電話findViewById(R.id.tv1)。當且僅當您的活動處於活動狀態並且您的佈局確實提供了一個ID爲tv1的文本視圖時,纔會返回正確的視圖。我假設你的xml佈局文件是正確的。我認爲它可能不得不做一些你從定時器中調用這個方法的東西,它不需要對你的應用程序做任何事情。試用getApplication().findViewById(R.id.tv1)。這將確保findViewById在您設置xml佈局的正確活動中進行搜索。

活動有其自己的生命週期,請參見here。這會導致問題,因爲您的活動可能會被殺死,更新過程將失敗。正如John指出的那樣,Service或AlarmManager是你應該使用的東西。請務必確保不要經常喚醒CPU,否則會導致電池電量耗盡。

相關問題