Java 从一个被调用2-3次的方法中,仅在1秒后调用一次方法

Java 从一个被调用2-3次的方法中,仅在1秒后调用一次方法,java,android,android-webview,Java,Android,Android Webview,当webviewurl更改时,下面的方法onReceivedTitle会在一秒钟内被调用2-3次。我想在上次调用onReceivedTitle时调用其中的一个方法。我这样做是因为我只想监视webview中的url更改shouldOverrideUrlLoading class MyWebChromeClient extends WebChromeClient { @Override public void onReceivedTitle(WebView vie

webview
url更改时,下面的方法
onReceivedTitle
会在一秒钟内被调用2-3次。我想在上次调用
onReceivedTitle
时调用其中的一个方法。我这样做是因为我只想监视webview中的url更改<当url通过ajax更改时,不会调用code>shouldOverrideUrlLoading

class MyWebChromeClient extends WebChromeClient {


        @Override
        public void onReceivedTitle(WebView view, String title) {
            Log.v("onReceivedTitle", "=>" + title);

            // callAMehod();
            super.onReceivedTitle(view, title);
        }

    }
您可能希望使用并执行以下操作:

class MyWebChromeClient extends WebChromeClient {

    private boolean mOnReceivedTitleInvoked;

    @Override
    public synchronized void onReceivedTitle(final WebView view, final String title) {
        if (!mOnReceivedTitleInvoked) {
            mOnReceivedTitleInvoked = true;
            Log.v("onReceivedTitle", "=>" + title);

            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    super.onReceivedTitle(view, title);
                    mOnReceivedTitleInvoked = false;
                }
            }, 1000);
        }
    }

}
尽管您可能希望重新考虑onReceivedTitle的行为。

您可能希望使用并执行以下操作:

class MyWebChromeClient extends WebChromeClient {

    private boolean mOnReceivedTitleInvoked;

    @Override
    public synchronized void onReceivedTitle(final WebView view, final String title) {
        if (!mOnReceivedTitleInvoked) {
            mOnReceivedTitleInvoked = true;
            Log.v("onReceivedTitle", "=>" + title);

            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    super.onReceivedTitle(view, title);
                    mOnReceivedTitleInvoked = false;
                }
            }, 1000);
        }
    }

}

尽管您可能希望重新考虑onReceivedTitle的
行为。

如果您想限制一个方法调用导致另一个方法调用的频率,您可以这样做,例如通过
处理程序。最简单的版本是在第一次调用时将延迟的消息排队,而在有消息排队时,任何后续调用都不会将新消息排队。这会导致每X次调用一次,但至少要花那么长的时间才能执行第一个操作

示例实现(您可以将未修改的类放在代码中的某个地方)

然后像这样使用它

class Usage {
    private ThrottleExecutor mThrottle = new ThrottleExecutor(2000) {
        @Override
        public void doThrottled() {
            // happens at most every 2000ms
            methodToBeThrottled();
        }
    };

    void methodThatHappensTooOften() {
        mThrottle.scheduleExecution();
    }

    void methodToBeThrottled() {
        Log.d("TAG", "triggered at 2000ms before");
    }
}

如果您想限制一个方法调用导致另一个方法调用的频率,您可以通过
处理程序
这样做。最简单的版本是在第一次调用时将延迟的消息排队,而在有消息排队时,任何后续调用都不会将新消息排队。这会导致每X次调用一次,但至少要花那么长的时间才能执行第一个操作

示例实现(您可以将未修改的类放在代码中的某个地方)

然后像这样使用它

class Usage {
    private ThrottleExecutor mThrottle = new ThrottleExecutor(2000) {
        @Override
        public void doThrottled() {
            // happens at most every 2000ms
            methodToBeThrottled();
        }
    };

    void methodThatHappensTooOften() {
        mThrottle.scheduleExecution();
    }

    void methodToBeThrottled() {
        Log.d("TAG", "triggered at 2000ms before");
    }
}

您将如何理解这是否是最后一次调用?无论何时在1秒或2秒后第一次调用该方法,它都将是最后一次。所以基本上我想用定时器,你能用Thread.sleep(6*1000)吗;i、 e.1秒后再试?您的意思是将Thread.spleep放入
onReceivedTitle
callAMehod()之后?那么
callAmethod
将被调用2到3次,但我只想调用一次!您将如何理解这是否是最后一次调用?无论何时在1秒或2秒后第一次调用该方法,它都将是最后一次。所以基本上我想用定时器,你能用Thread.sleep(6*1000)吗;i、 e.1秒后再试?您的意思是将Thread.spleep放入
onReceivedTitle
callAMehod()之后?那么
callAmethod
将被调用2到3次,但我只想调用一次!您好@curtisLoew您能告诉我,在我的方法被调用一次后,如何将
mOnReceivedTitleInvoked
重置为false?如果我再次按url,则
mOnReceivedTitleInvoked
将为真,并且不会让我的方法运行。请查看我的编辑。或者,请参见zapl解决方案。Hi@curtisLoew能否告诉我,在调用一次方法后,如何将
mOnReceivedTitleInvoked
重置为false?如果我再次按url,则
mOnReceivedTitleInvoked
将为真,并且不会让我的方法运行。请查看我的编辑。或者,请参见zapl解决方案。