Закрытие обработчика, удаление обратных вызовов, не может убить активность

В этой деятельности я использую Runnable вращать изображение в то время как Button нажата. Проблема заключается в том, что после того, как я завершаю работу с целым приложением, это действие отображается автоматически при повторном запуске приложения. Я узнал, что это происходит, когда обратные вызовы удаляются неправильно.

Мой вопрос: как я могу исправить этот код, чтобы правильно удалить все обратные вызовы и избежать повторного открытия активности в неподходящий момент.

public class MatchTimeActivity extends Activity {

Button MatchTime;
TextView Header1;
ImageView Face;
Timer myTimer;
private Handler matchHandler;
private Runnable matchAction;
public final static String match_int_value1="com.planis.matchthetime.match_int_value1";
public final static String match_int_value2="com.planis.matchthetime.match_int_value2";

@Override
public void onBackPressed() {
}

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_match_time);
    MatchTime = (Button) findViewById(R.id.MatchTimeButton);
    Header1 = (TextView) findViewById(R.id.MatchTimeHeader);
    Typeface custom_font2 = Typeface.createFromAsset(getAssets(), "fonts/font1.ttf");
    MatchTime.setTypeface(custom_font2);
    Header1.setTypeface(custom_font2);

    matchHandler = new Handler();
    matchAction = new Runnable() {
        @Override public void run() {
            Face = (ImageView) findViewById(R.id.MatchTimeImage);
            Face.setRotation(Face.getRotation()+9);                     
            matchHandler.postDelayed(this, 25);
        }
    };

    ListenTo(); 

}

public void onStop(){
    super.onStop();
    finish();
}
public void ListenTo(){
    MatchTime.setOnTouchListener(new OnTouchListener(){
        long time_start=0;
        long time_end=0;

        @Override
        public boolean onTouch(View view, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_DOWN ) {                
                time_start=System.currentTimeMillis();
                matchHandler.post(matchAction);

                return true;
            }
            if (event.getAction() == MotionEvent.ACTION_UP ) {                  
                time_end=System.currentTimeMillis();
                long TimeCounted=time_end-time_start;
                matchHandler.removeCallbacksAndMessages(null);
                matchHandler = null;
                SaveAndSend(TimeCounted);
                return true;
            }
            return false;
        }

    });
}



public void SaveAndSend(long TimeCountedlong){
    int TimeCountedint=(int)(long) TimeCountedlong;
    Intent intent = getIntent();                                            
    int TimeToMatchsas = intent.getIntExtra("display_int_value",0);
    Intent intent2 = new Intent(this, ResultsActivity.class);
        intent2.putExtra("match_int_value1", TimeToMatchsas);
        intent2.putExtra("match_int_value2", TimeCountedint);
    startActivity(intent2);
    finish();
}

}

1 ответ

Вам нужно зацепить onPause() и очистить ваши обратные вызовы, прежде чем ваша активность будет приостановлена ​​и в конечном итоге уничтожена.

@Override public void onPause() { matchHandler.removeCallbacksAndMessages(null); super.onPause(); }

Другие вопросы по тегам