I want to evaluate a javascript in Webview Android as given below in the code. I want to evaluate it after 3 seconds. It works, it gets evaluated after 3 seconds but it(the code inside run()) keeps repeating after every 3 seconds in an infinite loop. I just want to evaluate it once after 3 seconds
int delay = 3000;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"Reached",Toast.LENGTH_LONG).show();
final String js3 = "javascript:document.getElementsByClassName('icon')[0].click();";
view.evaluateJavascript(js3,null);
}
},delay);
MainActivity.java
public class MainActivity extends AppCompatActivity {
//webview
private WebView webView;
private String uname,password;
private int x=0;
private CountDownTimer timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
final String password = "Pass@123";
final String username = "111111111";
//url
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.loadUrl("https://something.com/xyz/abc/student2020.html#");
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
final String js = "javascript:" +
"document.getElementById('phone_1').value = '" + username + "';" +
"document.getElementById('submit_1').click()";
if (Build.VERSION.SDK_INT >= 19) {
view.evaluateJavascript(js,null);
final String js2 = "javascript:"+"document.getElementById('pass_2').value = '"+password+"';"
+ "document.getElementById('phone_2').value = '" + username + "';"
+ "javascript:document.getElementById('submit_2').click()";
view.evaluateJavascript(js2,null);
int delay = 3000;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,"Reached",Toast.LENGTH_LONG).show();
final String js3 = "javascript:document.getElementsByClassName('icon')[0].click();";
view.evaluateJavascript(js3,null);
}
},delay);
} else {
view.loadUrl(js);
}
}
});
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<WebView
android:id="@+id/webView"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
</RelativeLayout>
Advertisement
Answer
calling evaluateJavascript will make onPageFinished to be called further, in which you are setting, again, your Handler
simplest way to avoid this is introducing some boolean which will be flagged after evaluating JS and prevent second and further calls
private WebView webView; private String uname,password; private int x=0; private CountDownTimer timer; private boolean jsExecuted = false;
in callback
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (jsExecuted) return;
jsExecuted = true
// JS execution code
}
btw. you have probably some bug in flow for <19, only first JS will be loaded/executed