【问题标题】:Start loop and stop code with single button click只需单击一次按钮即可开始循环和停止代码
【发布时间】:2021-03-22 11:59:47
【问题描述】:

我想做一个简单的按钮,它会在我可以设置的每个时间段开始循环一个函数。但它不仅会启动循环,而且如果我再次单击该按钮也会停止循环。无论如何我可以通过一个按钮来实现这一点吗?

【问题讨论】:

    标签: java android loops android-studio button


    【解决方案1】:

    我会这样做

    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();
        }
    }
    

    【讨论】:

    • runOnClickListenerstopOnClickListener 给了我一个错误。你能帮帮我吗?
    • 可能是因为我使用的是 lambdas。尝试使用new View.OnClickListener() 代替view ->
    • 非常感谢!它就像一个魅力。
    【解决方案2】:

    对,举个简单的例子。

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

     //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 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);
                    }
    
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 2013-05-29
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多