2014-04-23 3 views
0

TimerTask가 내 응용 프로그램 조각 중 하나에서 실행되고 있습니다. "fragmentManager.beginTransaction(). replace"메서드를 사용하여 다른 조각으로 dinamically 전환하려고하면 내 응용 프로그램이 충돌합니다. 모든 사항을 완벽하게 설명하면 내 문제가 Timer bucause와 연결되어있을 것입니다. 나는 UiThread에서의 TimerTask를 실행하게조각을 변경할 때 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); 
    } 

어쩌면 내가 조각을 변경할 수 없습니다 : 여기 내 조각 내부의 타이머 코드? 답해 주셔서 감사합니다.

+0

SOOOOO .... 오류가있는 작업은 다음과 같습니다

당신이 조각이 같은

을 변경하기 전에 당신이 핸들러에 모든 콜백을 제거하십시오? 오, 내가 맞춰 보자. 바에서의 NPE. 셋 맥스()? 파편을 변경할 때 타이머를 멈추게하는 것은 어떨까요? – ElDuderino

답변

0

타이머가 동일한 작업에 대해 두 번 예약되면 충돌이 발생할 수 있습니다. 또한 타이머 작업에서 UI를 업데이트하기 위해 당신이 핸들러를 사용해야 할 수도 있습니다

참조 : 문서에서 Android timer updating a textview (UI)

0

: 귀하의 단편 replace()를 호출 한 후 파괴 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.

, 제 생각에는 addToBackStack() 메서드를 사용해야하며 메서드에서 hide() 메서드를 사용하거나 타이머를 중지해야한다고 생각합니다.

0

Timer 작업 대신 Handler Thread를 사용하십시오.

처리기 스레드는 UI 스레드에서 생성 된 별도의 스레드입니다. 그래서 그것은 UI 스레드와 대화 할 수 있고 Activity/Fragment를 변경할 수 있습니다.

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

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