Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在一定程度的不活动后关闭窗口/活动_Java_Android - Fatal编程技术网

Java 如何在一定程度的不活动后关闭窗口/活动

Java 如何在一定程度的不活动后关闭窗口/活动,java,android,Java,Android,我正在为Android设计一款音乐播放器应用程序,它将具有弹出控件。我目前正试图让这些控件在一段时间的不活动后关闭,但似乎没有一个明确的方法来实现这一点。到目前为止,我已经设法利用本网站和其他网站的一些建议拼凑出以下解决方案 private Timer originalTimer = new Timer(); @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceSt

我正在为Android设计一款音乐播放器应用程序,它将具有弹出控件。我目前正试图让这些控件在一段时间的不活动后关闭,但似乎没有一个明确的方法来实现这一点。到目前为止,我已经设法利用本网站和其他网站的一些建议拼凑出以下解决方案

private Timer originalTimer = new Timer();

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.playcontrols);

    View exitButton = findViewById(R.id.controls_exit_pane);
    exitButton.setOnClickListener(this);
    View volUpButton = findViewById(R.id.controls_vol_up);
    volUpButton.setOnClickListener(this);
    View playButton = findViewById(R.id.controls_play);
    playButton.setOnClickListener(this);
    View volDownButton = findViewById(R.id.controls_vol_down);
    volDownButton.setOnClickListener(this);

    musicPlayback();

    originalTimer.schedule(closeWindow, 5*1000);    //Closes activity after 10 seconds of inactivity

}
以及应该关闭窗口的代码

//Closes activity after 10 seconds of inactivity
public void onUserInteraction(){
    closeWindow.cancel();   //not sure if this is required?
    originalTimer.cancel();
    originalTimer.schedule(closeWindow, 5*1000);
}

private TimerTask closeWindow = new TimerTask() {

    @Override
    public void run() {
        finish();
    }
};

上面的代码对我来说非常有意义,但它强制关闭任何用户交互。但是,如果未触及,它会正常关闭,如果我删除第二个日程表,它在交互后不会关闭,所以这似乎是问题所在。还请注意,我想我将把这个计时任务转移到另一个线程,以帮助保持UI的敏捷性。我需要首先让它工作:D.如果有任何更多的信息我需要提供,请询问并感谢任何帮助…你们这些家伙太棒了

根据@commonware的建议,切换到处理程序。工作完美。非常感谢

private final int delayTime = 3000;
private Handler myHandler = new Handler();

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.playcontrols);

    View exitButton = findViewById(R.id.controls_exit_pane);
    exitButton.setOnClickListener(this);
    View volUpButton = findViewById(R.id.controls_vol_up);
    volUpButton.setOnClickListener(this);
    View playButton = findViewById(R.id.controls_play);
    playButton.setOnClickListener(this);
    View volDownButton = findViewById(R.id.controls_vol_down);
    volDownButton.setOnClickListener(this);

    musicPlayback();

    myHandler.postDelayed(closeControls, delayTime);

}
还有其他的方法

//Closes activity after 10 seconds of inactivity
public void onUserInteraction(){
    myHandler.removeCallbacks(closeControls);
    myHandler.postDelayed(closeControls, delayTime);
}

private Runnable closeControls = new Runnable() {
    public void run() {
        finish();
        overridePendingTransition(R.anim.fadein, R.anim.fadeout);
    }
};

要完成上面的回答,请注意,只有当您关心单击时,Activity.onUserInteraction()才足够

文档中的状态为:“请注意,此回调将为开始触摸手势的触摸操作调用,但可能不会为随后的触摸移动和触摸操作调用。”


实际的实现证明,它确实忽略了平板电脑上的所有动作,这意味着时钟永远不会在不松开手指的情况下重置。另一方面,这也意味着时钟不会太频繁地重置,这限制了开销。

使用Eclipse中的
adb logcat
、DDMS或DDMS透视图来检查logcat并查看与“强制关闭”相关联的堆栈跟踪。而不是
定时器
定时器任务
,我建议使用
处理程序
postDelayed()
来计划在延迟期后调用
Runnable
。如果存在用户交互,则可以使用
removeCallbacks()
取消计划
Runnable
,并使用
postDelayed()
再次计划。优点是,这将使您可以控制主应用程序线程,而
TimerTask
位于后台线程,这可能是崩溃的原因。仍在使用此功能…以前从未使用过logcat…给我以下输出:E/AndroidRuntime(3835):致命异常:main E/AndroidRuntime(3835):java.lang.IllegalStateException:计时器被取消E/AndroidRuntime(3835):在java.util.Timer.scheduleImpl(Timer.java:566)E/AndroidRuntime(3835):在java.util.Timer.schedule(Timer.java:463)E/AndroidRuntime(3835):在org.stephenfin.zoomplayer.PlayerControls.onUs eInteraction(PlayerControls.java:69)那么,
PlayerControls
类的第69行是什么?是timer cancel()调用。不知道为什么,但它对被取消感到不高兴。不过,处理程序工作正常,显然是一个更好的解决方案