2013-02-27 2 views
0

나는 운동을하는 데 걸리는 시간을 측정하기 위해 활동하고 있지만 아직 해결할 수없는 버그가 있습니다.변수의 값이 갑자기 0으로 설정되었습니다.

내가 어떤 운동, 모든 작품에서 처음으로 클릭하면 변수 "remainingsSets는"0

에 잘 살고 때까지

TrainingFragment는 사용자가 클릭하면 다음 내 ExerciseActivity이 시작되고 실행 연습의 목록을 보여줍니다 잘되면, ExerciseActivity가 올바르게 작동하여 TrainingFragment 로의 리턴이 끝납니다. 그러나 다른 운동에서 클릭하려고하면 운동 능동이 닫힙니다.

내 디버그에서 "remainingSets"변수가 올바른 값 (remainingSets = getIntent().getIntExtra("remaining_sets", 3))과 함께 제공되지만 startButton을 클릭하면 "remainingSets"변수가 0으로 설정된 이유를 알 수 없습니다. 이 조건은 if (remainingSets > 0){...}이므로 작업이 종료되었습니다. 여기

내 TrainingFragment입니다 :

public class TrainingFragment extends Fragment { 

private final static int START_EXERCISE = 1; 

private Training training; 
private String lastItemClicked; 
private String[] values; 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

    Bundle bundle = getArguments(); 
    if (bundle != null) { 
     training = bundle.getParcelable("training"); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return (ScrollView) inflater.inflate(R.layout.template_exercises, container, false); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    LinearLayout exercisesContainer = (LinearLayout) getView().findViewById(R.id.exercises); 
    LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    List<Exercise> exercises = training.getExercises(); 
    values = new String[exercises.size()]; 

    if (savedInstanceState != null) { 
     values = savedInstanceState.getStringArray("values"); 
    } 

    for (int i = 0; i < exercises.size(); i++) { 
     final View exerciseView = inflater.inflate(R.layout.template_exercise, null); 

     exerciseView.setTag(String.valueOf(i)); 

     TextView remainingSets = (TextView) exerciseView.findViewById(R.id.remaining_sets); 

     if (savedInstanceState != null) { 
      remainingSets.setText(values[i]); 
     } else { 
      String sets = exercises.get(i).getSets(); 
      remainingSets.setText(sets); 
      values[i] = sets; 
     } 

     exerciseView.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getActivity(), ExerciseActivity.class); 
       intent.putExtra("remaining_sets", 
         Integer.valueOf(((TextView) v.findViewById(R.id.remaining_sets)).getText().toString())); 

       lastItemClicked = v.getTag().toString(); 

       startActivityForResult(intent, START_EXERCISE); 
      } 
     }); 

     exercisesContainer.addView(exerciseView); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putStringArray("values", values); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    View view = ((LinearLayout) getView().findViewById(R.id.exercises)).findViewWithTag(lastItemClicked); 

    if (requestCode == START_EXERCISE) { 
     if (resultCode == Activity.RESULT_OK) { // the exercise had been 
               // finished. 
      ((TextView) view.findViewById(R.id.remaining_sets)).setText("0"); 

      view.setClickable(false); 

      values[Integer.valueOf(lastItemClicked)] = "0"; 

     } else if (resultCode == Activity.RESULT_CANCELED) { 

      String remainingSets = data.getStringExtra("remaining_sets"); 
      ((TextView) view.findViewById(R.id.remaining_sets)).setText(remainingSets); 

      values[Integer.valueOf(lastItemClicked)] = remainingSets; 
     } 
    } 
} 
} 

내 ExerciseActivity :

public class ExerciseActivity extends Activity { 

private Chronometer chronometer; 
private TextView timer; 
private Button startButton; 
private Button endButton; 
private int remainingSets; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_exercise); 

    ExerciseEvents.addExerciseListener(new PopupExerciseListener()); 

    chronometer = (Chronometer) findViewById(R.id.exercise_doing_timer); 
    timer = (TextView) findViewById(R.id.timer); 

    startButton = (Button) findViewById(R.id.start_exercise); 
    startButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ExerciseEvents.onExerciseBegin(); 
     } 
    }); 

    endButton = (Button) findViewById(R.id.end_exercise); 
    endButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ExerciseEvents.onExerciseRest(); 
     } 
    }); 
} 

@Override 
public void onBackPressed() { 
    Intent intent = new Intent(); 
    intent.putExtra("remaining_sets", String.valueOf(remainingSets)); 
    setResult(RESULT_CANCELED, intent); 

    super.onBackPressed(); 
} 

public class PopupExerciseListener implements ExerciseListener { 

    public PopupExerciseListener() { 
     remainingSets = getIntent().getIntExtra("remaining_sets", 3); 
    } 

    @Override 
    public void onExerciseBegin() { 
     if (remainingSets > 0) { 
      chronometer.setVisibility(View.VISIBLE); 
      timer.setVisibility(View.GONE); 

      chronometer.setBase(SystemClock.elapsedRealtime()); 
      chronometer.start(); 

      startButton.setVisibility(View.GONE); 
      endButton.setVisibility(View.VISIBLE); 
     } else { 
      ExerciseEvents.onExerciseFinish(); 
     } 
    } 

    @Override 
    public void onExerciseFinish() { 
     setResult(RESULT_OK); 

     finish(); 
    } 

    @Override 
    public void onExerciseRest() { 
     chronometer.setVisibility(View.GONE); 
     endButton.setVisibility(View.GONE); 
     timer.setVisibility(View.VISIBLE); 

     long restTime = getIntent().getLongExtra("time_to_rest", 60) * 1000; 
     new CountDownTimer(restTime, 1000) { 

      @Override 
      public void onTick(long millisUntilFinished) { 
       timer.setText(String.valueOf(millisUntilFinished/1000)); 
      } 

      @Override 
      public void onFinish() { 
       ExerciseEvents.onExerciseBegin(); 
      } 
     }.start(); 

     remainingSets--; 
    } 
} 
} 

그리고 내 ExerciseEvents :

public class ExerciseEvents { 

private static LinkedList<ExerciseListener> mExerciseListeners = new LinkedList<ExerciseListener>(); 

public static void addExerciseListener(ExerciseListener listener) { 
    mExerciseListeners.add(listener); 
} 

public static void removeExerciseListener(String listener) { 
    mExerciseListeners.remove(listener); 
} 

public static void onExerciseBegin() { 
    for (ExerciseListener l : mExerciseListeners) { 
     l.onExerciseBegin(); 
    } 
} 

public static void onExerciseRest() { 
    for (ExerciseListener l : mExerciseListeners) { 
     l.onExerciseRest(); 
    } 
} 

public static void onExerciseFinish() { 
    for (ExerciseListener l : mExerciseListeners) { 
     l.onExerciseFinish(); 
    } 
} 

public static interface ExerciseListener { 

    public void onExerciseBegin(); 

    public void onExerciseRest(); 

    public void onExerciseFinish(); 
} 
} 

사람이 나에게 어떤 도움을 줄 수 있을까?

당신은 당신의 코드를 업데이트 한 후
+0

어디에서''remaining_sets "'를 읽으며 활동을 어디에서 끝내나요? 이 코드도 게시하십시오. – Sam

+0

당신은 첫 번째 시간 후에 만 ​​일어난다 고 말했습니다. 그래서 처음 세트를 실행하고 0으로 카운트 다운합니다. 당신의 remainingSets는 이제 0입니다. 당신은 remainingSets를 3으로 리셋하지 않기 때문에 다시 시작합니다. , 그것은 0이 될거야 귀하의 애플 리케이션을 닫습니다. – dymmeh

+0

코드를보고 알아내는 것은 어렵습니다. 'remainingSet'이 할당되거나 수정 된 각 지점에 중단 점을 넣습니다. 그게 왜 0으로 설정되었는지, 왜 0에 도달했는지 말해 줄 수 있습니다. –

답변

1

, 난 당신이 코드에서 큰 메모리 누수를 참조하십시오

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_exercise); 

    ExerciseEvents.addExerciseListener(new PopupExerciseListener()); 
    .... 
} 

호출 ExerciseEvents.addExerciseListener(new PopupExerciseListener())는 정적/글로벌 목록에 새 PopupExerciseListener을 추가 ExcerciseEvents.mExerciseListeners. 클래스 PopupExerciseListener은 내부 클래스이기 때문에 암시 적으로 그 둘러싸는 ExcerciseActivity에 대한 참조를 보유합니다. 이것은 코드가 ExcerciseActivity의 각 인스턴스를 영원히 붙잡고 있다는 것을 의미합니다. 안좋다.

이것은 또한 이상한 행동을 설명합니다. onExcersizeXXX() 메서드 중 하나가 호출되면 연결된 목록의 모든 ExcerciseListeners, 이전 화면의 ExcerciseListener 및 현재 목록의 ExcerciseListener를 호출합니다.

당신의 ExcerciseActivity.java이 시도 : onDestroy에서

.... 
ExerciseListener mExerciseListener; 
.... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    .... 
    .... 
    mExerciseListener = new PopupExerciseListener() 
    ExerciseEvents.addExerciseListener(mExerciseListener); 
    .... 
    .... 
} 

@Override 
protected void onDestroy() { 
    ExerciseEvents.removeExerciseListener(mExerciseListener); 
    super.onDestroy(); 
} 

.... 

, 당신은 당신의 청취자를 등록 해제, 메모리 누수를 방지하고 더 이상 존재하지 않는 활동에 부착 된 PopupExerciseListeners에 홀수 배 콜백을 방지 할 수있다.

+0

그게 다야! 그것은 효과가있다! \ o/ 정말 고마워요! – mvalencaa

관련 문제