【问题标题】:How to cancel() timer after opening the Activity for the second time?第二次打开Activity后如何取消()定时器?
【发布时间】:2013-12-15 18:14:31
【问题描述】:

问候,

我创建了计时器来显示特定时间的吐司。打开开关键后定时器开始工作,关闭开关键后定时器将被取消。我正在使用 SharedPrefrences 来保存切换视图的状态。一切正常,但是一旦我回到上一个活动并再次打开活动,然后尝试通过关闭开关键来取消计时器,我就会收到强制关闭消息。那么,您对解决这个问题有什么建议呢?

代码:

import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Switch;
import android.widget.Toast;

public class AutoReminder extends Activity {

    TimerTask tt;
    Timer t;
    Switch mySwitch;
    SharedPreferences appPrefs;

    String TAG;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auto_reminder);

        mySwitch = (Switch) findViewById(R.id.switch1);

        appPrefs = getSharedPreferences("ishaqdev.app.hasanat",MODE_PRIVATE);
        Boolean setSwitch = appPrefs.getBoolean("switchValue", false);
        if (setSwitch == false){
            mySwitch.setChecked(false);
        }else{
            mySwitch.setChecked(true);
        }


        mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if (isChecked) {                    
                    SharedPreferences.Editor prefsEditor = appPrefs.edit();
                    prefsEditor.putBoolean("switchValue", true);
                    prefsEditor.commit();

                    tt = new TimerTask() 
                    {
                        @Override
                        public void run() {
                            runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(), "Hello Timer !!", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }      
                    };
                    t = new Timer();

                    t.schedule(tt,0,5000);
                } else {                    
                    SharedPreferences.Editor prefsEditor = appPrefs.edit();
                    prefsEditor.putBoolean("switchValue", false);
                    prefsEditor.commit();
                    Log.v(TAG, "After SP");

                    t.cancel();
                    Log.v(TAG, "Final Step");
                }
            }
        });
    }
}

【问题讨论】:

    标签: android timer


    【解决方案1】:

    你应该把堆栈跟踪。通过猜测,我认为当您再次打开活动时计时器为空,因此在取消开关之前进行这样的空检查

    if(t != null)
       t.cancel();
    

    希望对你有所帮助。

    【讨论】:

    • 是的,定时器是空的,这就是问题所在,我尝试了你的建议,但它没有执行 t.cancel();所以没有强制关闭消息以及计时器仍在工作所以,解决方案是什么?
    • @user3104095 首先告诉我,当你移动到上一个活动时,toast 仍然显示对吗?如果是,那么您是否需要此功能,因为在进行上一个活动时,您可能不想显示吐司?请让我清楚这一点。
    • 是的,它仍在显示,我需要它一直显示,直到我通过切换键停止它
    • @user3104095 然后创建一个带有静态 setter 和 getter 方法的 java 类,它将 Timer 作为参数并尝试使用它。
    • 好建议,请指导我如何实施?
    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多