2016-07-18 2 views
0

У меня проблема с изменением Fragments. В моем приложении я использую TimerTisk для обновления TextView каждую секунду (таймер для пользователя), когда мы меняем Fragment у нас есть NullPointerException. Я знаю, почему это происходит, но я не могу остановить TimerTask, потому что мой таймер для пользователя должен работать, пока пользователь не остановит его сам. Как я могу решить эту проблему, как таймер может работать в backgroud? Мой Fragment:Как изменить фрагмент без остановки TimerTask. Android

public class WalkingFragment extends Fragment implements View.OnClickListener { 

    private String timeTxt = ""; 
    TextView textViewWalkingTimer; 
    Button startWalkingBC; 

    private Timer walkingTimer; 
    private int period = 0; 
    private boolean flag = false; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_walking, container, false); 

     textViewWalkingTimer = (TextView) view.findViewById(R.id.textViewWalkingTimer); 

     startWalkingBC = (Button) view.findViewById(R.id.start_walking); 
     startWalkingBC.setOnClickListener(this); 

     return view; 
    } 

    public void startWalkingButtonClick() { 

     if (!flag) { 
      walkingTimer = new Timer(); 
      walkingTimer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        TimerForWalking(); 
       } 
      }, 0, 1000); 

      startWalkingBC.setText("Stop"); 
      flag = true; 
     } else if (flag) { 
      period = 0; 
      if (walkingTimer != null) { 
       walkingTimer.cancel(); 
       flag = false; 
       textViewWalkingTimer.setText(""); 
       startWalkingBC.setText("Start"); 
      } 
     } 
    } 

    private void TimerForWalking() { 
     this.getActivity().runOnUiThread(Timer_Tick); 
    } 

    private Runnable Timer_Tick = new Runnable() { 
     @Override 
     public void run() { 
      period++; 
      timeTxt = (new SimpleDateFormat("hh:mm:ss")).format(new Date(period * 1000)); 
      textViewWalkingTimer.setText(timeTxt); 
     } 
    }; 


    @Override 
    public void onClick(View v) { 
     switch (v.getId()){ 
      case R.id.start_walking: 
       startWalkingButtonClick(); 
       break; 

     ................. 

      default: 
       break; 
     } 
    } 
} 

код работает отлично, пока мы не изменим Fragment. Я новичок в Android и это мое первое приложение. Большое спасибо за любую помощь.

ответ

0

Фрагменты, которые вы создаете, будут сохранены до тех пор, пока не родится родительский Activity. Я рекомендую вам обмениваться фрагментом, в котором вы запускаете таймер с помощью Activity, чтобы сохранить его значение и получить его в другом фрагменте. Также я рекомендую вам проверить this, чтобы проверить, как их можно сообщить.

Надеюсь, это поможет.

+0

Спасибо. Я попробую. – Tash

Смежные вопросы