在不使用处理程序的情况下进行x次操作的最佳方法?

时间:2018-11-25 05:06:58

标签: android

我要替换此功能:

private void transmit(){
    final Handler mHandler = new Handler();

    Toast.makeText(this, "Wait for the connection to stablish",Toast.LENGTH_LONG).show();

    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {

            //Log.d("BtSending", "run: Sending..");


            mBluetoothLeService.writeCharacteristic(superString,bluetoothGattCharacteristicHM_10);

            mHandler.postDelayed(this,250);

        }
    },1000);

}

对于一些更漂亮的东西,它工作得很好,但是一个朋友告诉我,有一种更有效的方法来做,但是我不记得他告诉我了什么。请帮助我,谢谢。

1 个答案:

答案 0 :(得分:0)

处理程序是快速连续运行重复操作的推荐方法。不过,这并不意味着您不能使代码更加整洁。

private final int MSG_TRANSMIT = 100;

private TransmitHandler handler = new TransmitHandler();

private void transmit() {
    //...

    handler.sendInitialTransmit();
}

public class TransmitHandler extends Handler {
    public TransmitHandler() {
        super(Looper.getMainLooper());
    }

    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case MSG_TRANSMIT:
                mBluetoothLeService.writeCharacteristic(superString,bluetoothGattCharacteristicHM_10);
                if (shouldTransmit) sendTransmit(); //shouldTransmit is an arbitrary boolean so you can stop the loop when needed
                break;
        }
    }

    public void sendInitialTransmit() {
        sendEmptyMessageAtTime(MSG_TRANSMIT, SystemClock.uptimeMillis() + 1000);
    }

    public void sendTransmit() {
        sendEmptyMessageAtTime(MSG_TRANSMIT, SystemClock.uptimeMillis() + 250); //where 250 is your delay
    }

    public void cancelTransmit() {
        removeMessages(MSG_TRANSMIT); //if MSG_TRANSMIT is currently queued to be executed, calling cancelTrasmit() will remove it from the queue
    }
}