2014-03-13 54 views
0

下面的方法onReceivedTitle被调用2-3次,在第二次时webview url更改。我想在上面调用onReceivedTitle时调用其中的方法。我这样做是因为我只想在webview中监视URL更改。当url通过ajax更改时,shouldOverrideUrlLoading没有被调用。调用一个方法后,只需调用一次方法,调用2-3次

class MyWebChromeClient extends WebChromeClient { 


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

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

    } 
+0

,你会怎么去理解这是否是最后一次通话或不? –

+0

每当1秒或2秒后第一次调用方法时,它将是最后一次肯定。所以基本上我想使用像定时器的东西。 – Sunny

+0

你可以使用Thread.sleep(6 * 1000);即1秒并尝试? –

回答

2

您可能需要使用Handler,做这样的事情:

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行为。

+0

Hi @curtisLoew你能告诉我如何在调用getCalled方法后将'mOnReceivedTitleInvoked'重置为false?如果我再次按下url,那么'mOnReceivedTitleInvoked'将是true,它不会让我的方法运行。 – Sunny

+0

请参阅我的编辑。或者,请参阅zapl解决方案。 – curtisLoew

+0

感谢朋友它的工作原理! – Sunny

3

如果您想要限制方法调用导致另一方法调用的频率,您可以通过例如Handler进行调用。最简单的版本在第一次调用和任何后续调用中排队延迟消息,而入队消息不会入队。这导致每X时间需要1次呼叫 - 但至少需要等待第一个动作发生的时间。

实现示例(你可以把你的代码,类未修改的地方)

public abstract class ThrottleExecutor { 
    private final long mMinDelay; 

    public ThrottleExecutor(long minDelay) { 
     mMinDelay = minDelay; 
    } 

    /** Implement to do something */ 
    public abstract void doThrottled(); 

    public final void scheduleExecution() { 
     if (mHandler.hasMessages(0)) { 
      // message already enqueued, do nothing 
     } else { 
      // otherwise enqueue a message for later 
      mHandler.sendEmptyMessageDelayed(0, mMinDelay); 
     } 
    } 

    public final void cancelExecution() { 
     mHandler.removeMessages(0); 
    } 

    private final Handler mHandler = new Handler(Looper.getMainLooper()) { 
     @Override 
     public void handleMessage(Message msg) { 
      doThrottled(); 
     } 
    }; 
} 

,然后用它例如像这样

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