【问题标题】:How to Stop a Loop at the Press of a Button如何在按下按钮时停止循环
【发布时间】:2012-07-14 08:59:30
【问题描述】:

我希望onClick方法不仅可以为新页面创建一个新活动,还可以触发循环结束,这样如果有人点击了闪屏的背景,新屏幕不会重新加载循环停止。

这是我的代码,

package clouds.clouds;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class splash extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
     Thread logotimer = new Thread() {


            @Override
            public void run(){
                try{
                    int logotimer = 0;
                    while(logotimer <5000) {
                        sleep(100);
                        logotimer = logotimer +100;

                    }
                    startActivity(new Intent("clouds.clouds.SPLASH"));
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                finally{
                    finish();
                }

            }



        };
      logotimer.start();


}



    public void onClickz(View v){}
    public void speed2 (View v){

        startActivity(new Intent("clouds.clouds.BUTTONZ"));
    }



}

有什么建议吗?

【问题讨论】:

  • 不幸的是,我对循环几乎一无所知,因为我遵循的教程提供了我需要的所有代码,但没有获得超出教程已经给我的知识来增强的知识。跨度>
  • 问题是我无法从我的 onClick 方法访问 logotimer,因为它在线程中是隔离的。我说得有道理吗?
  • 我尝试移动线程以包含 onClick 方法并移动 onClick 方法以扩展线程。

标签: java android loops button android-activity


【解决方案1】:

在您的 onClick() 方法中调用 logotimer.interrupt()。这应该会在你的线程中导致一个InterruptedException,你应该什么都不做(或者当你中断你的线程时你想做的任何其他事情)来处理它

【讨论】:

  • 我很可能是错的,但是我认为不可能从线程外部引用“logotimer”。我是 Java 新手,感谢您的意见。
  • 当然可以。只需将Thead logotimer; 定义为类中的全局变量。然后在您的onCreate() 方法中,您可以像上面那样使用logotimer = new Thread() {....} 实例化一个新的线程对象。现在您可以在您的onClick() 方法中访问它来调用logotimer.interrupt()。您应该会看到您的 InterruptedException 在您的线程中被触发
  • 我理解了大部分内容,并对其进行了一些实验,但是由于我无法完全掌握这个概念而失败了。我想知道您是否可以使用一些示例代码来说明您在说什么。
  • 我将在新答案中发布因您的答案而得出的代码
  • 您发布的内容看起来不错,但我看不到您将 onClick 侦听器与您尝试单击的视图绑定的位置。根据您的描述,您似乎有一个启动画面(我假设是ImageView)。如果是这种情况,那么您应该将 onClick 侦听器绑定到您的ImageView。试试看,让我知道你发现了什么。
【解决方案2】:

volatile 布尔变量添加到您的类(称为cancelled)。单击按钮时将其设置为true,并在while 条件中检查cancelled == false

public class splash extends Activity {

    volatile bool cancelled = false;
...

protected void onCancel(...)
{
    cancelled = true;

...

while(!cancelled && logotimer <5000) {
...

【讨论】:

  • 恐怕当我试图在我的代码中应用这个答案时,它失败了,但是如果你能把它放在原始代码的上下文中,我可能能够准确地复制它。那可能吗?很抱歉给您带来不便。
  • 嗯,第一个闪屏正常显示,然后,它跳过第二个闪屏,进入菜单,然后返回第二个闪屏,最后重新加载菜单。跨度>
  • 我已经发现了原因,这不是由于您的解决方案。 :)
  • 不幸的是,它仍然无法正常工作。这里发生了什么,protected void onCancel("...")?
【解决方案3】:
boolean exit = false;
int logotimer = 0;
while(logotimer <5000 && exit != false) {
  sleep(100);
  logotimer = logotimer +100;
  // value = ???    
  if(logotimer == value) {
      exit = true;
  }
}

【讨论】:

  • 我不太确定尝试这段代码时发生了什么。不用说,它没有用。
  • 它不起作用的原因是 1. exit 被分配为 null,不清楚,因为它是 boolean。 2. 代码本身的错别字... logotime 检查if 语句....
  • 什么可以代替价值?
【解决方案4】:
package clouds.clouds;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class splash extends Activity {
Thread logotimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);

     logotimer = new Thread();
     Thread logotimer = new Thread() {

            @Override
            public void run(){
                try{
                    int logotimer = 0;
                    while(logotimer <5000) {
                        sleep(100);
                        logotimer = logotimer +100;
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                finally{
                    finish();
                }
                startActivity(new Intent("clouds.clouds.SPLASH"));
            }



        };
      logotimer.start();


}


public void onClickz (View v){}
public void speed2 (View v){
    logotimer.interrupt();
    startActivity(new Intent("clouds.clouds.BUTTONZ"));
}






}

【讨论】:

  • 这看起来不错,只要speed2() 确实是您的图像视图的onClick。在线程代码中的 catch 子句中放置一个断点,以验证在您执行中断时这实际上是被触发的。
  • 您的错误是您在onCreate() 中创建了一个新的局部变量logotimer,而不是使用您的全局变量。在您的onCreate() 中将Thread logotimer = {...} 更改为logotimer = {...}
  • 或者您可以删除第二个 logotimer 声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2020-06-01
  • 2017-01-26
  • 2018-03-20
  • 1970-01-01
  • 2015-02-20
相关资源
最近更新 更多