2014-04-23 104 views
0

我有一個TimerTask在我的應用程序的片段之一內運行;當我嘗試使用「fragmentManager.beginTransaction()。dinamically切換到另一個片段。替換」方法我的應用程序崩潰。 我敢肯定,我的問題是與計時器bucause連接,如果我評論它一切正常完美。 這裏是我的片段裏面的計時器代碼:更改片段時TimerTask崩潰

 public void startTimer(ProgressBar b){ 
    final ProgressBar bar = b; 
     t = new Timer(); 
     task = new TimerTask() { 

     @Override 
     public void run() { 
     getActivity().runOnUiThread(new Runnable() { 

      @Override 
     public void run() { 
       bar.setMax(3600); 
      bar.setProgress(mytime); 
      //TextView tv1 = (TextView) getView().findViewById(R.id.textView2); 
      //tv1.setText("TIME LEFT:" +time); 
      if (mytime <= 3600) 
      mytime += 1; 
      else { 
      //tv1.setText("GAME OVER");   
      } 
     } 
     }); 
     } 
     }; 
     t.scheduleAtFixedRate(task, 0, 1000); 
    } 

也許當我在UiThread運行的TimerTask我不能改變的片段? 感謝您的任何答案。

+0

SOOOOO ....有什麼錯誤?哦,讓我猜... NPE在bar.setMax()?如何在更換碎片時停止計時器? – ElDuderino

回答

0

從技術文檔:replace()

Replace an existing fragment that was added to a container. This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here.

您的片段呼籲replace()破壞後,我認爲你應該使用方法addToBackStack()或使用hide()方法或在onDestroy()方法中停止定時器。

0

使用處理程序線程代替計時器任務。

處理程序線程是從UI線程創建的單獨線程。所以它可以與UI線程交談,您可以更改活動/片段。

確保您清除所有的回調到處理器更改片段

這樣前:

final Handler handler=new Handler(); 
    handler.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      if(condition) 
      { 
       handler.removeCallbacks(this); 
      } 
      else 
      { 
       handler.postDelayed(this,3600); 
      } 
     } 
    }, 3600);