Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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_Loops_Android Studio_Button - Fatal编程技术网

Java 单击一个按钮即可启动循环和停止代码

Java 单击一个按钮即可启动循环和停止代码,java,android,loops,android-studio,button,Java,Android,Loops,Android Studio,Button,我想做一个简单的按钮,它将开始循环的功能,每一段时间,我可以设置。但它不仅会启动循环,而且还会在我再次单击按钮时停止循环。我是否可以通过一个按钮实现这一点?是的,给你一个简单的例子 首先,创建两个常量值和一个实例变量: //indicate whether or not the loop is running private boolean isRunning = false; //used for handler to send empty msg private

我想做一个简单的按钮,它将开始循环的功能,每一段时间,我可以设置。但它不仅会启动循环,而且还会在我再次单击按钮时停止循环。我是否可以通过一个按钮实现这一点?

是的,给你一个简单的例子

首先,创建两个常量值和一个实例变量:

 //indicate whether or not the loop is running
    private boolean isRunning = false;

    //used for handler to send empty msg
    private final static int MSG_LOOP = 1;
    private final static long LOOP_INTERVAL = 5000;
然后创建一个
处理程序
实例来处理循环逻辑:

Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MSG_LOOP:
                    doStuff();
                    break;
            }
        }
    };


    private void doStuff() {
        //after what you want to do is done, send another MSG_LOOP msg with delay
        handler.sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);
    }

最后:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isRunning) {
                    //cancel if any in the message queue
                    handler.removeMessages(MSG_LOOP);
                } else {
                    //if you do not want to start the loop immediately, then use: "sendEmptyMessageDelayed"
                    handler.sendEmptyMessage(MSG_LOOP);
                }

            }
        });

是的,给你一个简单的例子

首先,创建两个常量值和一个实例变量:

 //indicate whether or not the loop is running
    private boolean isRunning = false;

    //used for handler to send empty msg
    private final static int MSG_LOOP = 1;
    private final static long LOOP_INTERVAL = 5000;
然后创建一个
处理程序
实例来处理循环逻辑:

Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case MSG_LOOP:
                    doStuff();
                    break;
            }
        }
    };


    private void doStuff() {
        //after what you want to do is done, send another MSG_LOOP msg with delay
        handler.sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);
    }

最后:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isRunning) {
                    //cancel if any in the message queue
                    handler.removeMessages(MSG_LOOP);
                } else {
                    //if you do not want to start the loop immediately, then use: "sendEmptyMessageDelayed"
                    handler.sendEmptyMessage(MSG_LOOP);
                }

            }
        });
我会这样做的

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private View.OnClickListener runOnClickListener;
    private View.OnClickListener stopOnClickListener;


    void init() {
        Handler handler = new Handler();
        int duration = 5000;

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                foo();
                handler.postDelayed(this, duration);
            }
        };

        runOnClickListener = view -> {
            runnable.run();
            btn.setOnClickListener(stopOnClickListener);
        };

        stopOnClickListener = view -> {
            handler.removeCallbacks(runnable);
            btn.setOnClickListener(runOnClickListener);
        };

       btn.setOnClickListener(runOnClickListener);
    }

    void foo() {
        Log.i("foo", "foo");
    }

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

        btn = findViewById(R.id.btn);

        init();
    }
}
我会这样做的

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private View.OnClickListener runOnClickListener;
    private View.OnClickListener stopOnClickListener;


    void init() {
        Handler handler = new Handler();
        int duration = 5000;

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                foo();
                handler.postDelayed(this, duration);
            }
        };

        runOnClickListener = view -> {
            runnable.run();
            btn.setOnClickListener(stopOnClickListener);
        };

        stopOnClickListener = view -> {
            handler.removeCallbacks(runnable);
            btn.setOnClickListener(runOnClickListener);
        };

       btn.setOnClickListener(runOnClickListener);
    }

    void foo() {
        Log.i("foo", "foo");
    }

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

        btn = findViewById(R.id.btn);

        init();
    }
}

runOnClickListener
stopOnClickListener
给了我一个错误。你能帮我吗?可能是因为我用的是lambdas。尝试使用
newview.OnClickListener()
代替
View->
非常感谢!它就像一个魔咒。
runOnClickListener
stopOnClickListener
给了我一个错误。你能帮我吗?可能是因为我用的是lambdas。尝试使用
newview.OnClickListener()
代替
View->
非常感谢!它就像一个符咒。