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解决方案。