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
JavaScript
x
11
11
1
int delay = 3000;
2
new Handler().postDelayed(new Runnable() {
3
@Override
4
public void run() {
5
6
Toast.makeText(MainActivity.this,"Reached",Toast.LENGTH_LONG).show();
7
final String js3 = "javascript:document.getElementsByClassName('icon')[0].click();";
8
view.evaluateJavascript(js3,null);
9
}
10
},delay);
11
MainActivity.java
JavaScript
1
59
59
1
public class MainActivity extends AppCompatActivity {
2
3
//webview
4
private WebView webView;
5
private String uname,password;
6
private int x=0;
7
private CountDownTimer timer;
8
9
10
@Override
11
protected void onCreate(Bundle savedInstanceState) {
12
super.onCreate(savedInstanceState);
13
setContentView(R.layout.activity_main);
14
15
webView = (WebView) findViewById(R.id.webView);
16
17
18
final String password = "Pass@123";
19
final String username = "111111111";
20
//url
21
webView.getSettings().setJavaScriptEnabled(true);
22
webView.getSettings().setDomStorageEnabled(true);
23
webView.loadUrl("https://something.com/xyz/abc/student2020.html#");
24
webView.setWebViewClient(new WebViewClient(){
25
@Override
26
public void onPageFinished(WebView view, String url) {
27
super.onPageFinished(view, url);
28
29
final String js = "javascript:" +
30
"document.getElementById('phone_1').value = '" + username + "';" +
31
"document.getElementById('submit_1').click()";
32
33
if (Build.VERSION.SDK_INT >= 19) {
34
view.evaluateJavascript(js,null);
35
36
final String js2 = "javascript:"+"document.getElementById('pass_2').value = '"+password+"';"
37
+ "document.getElementById('phone_2').value = '" + username + "';"
38
+ "javascript:document.getElementById('submit_2').click()";
39
view.evaluateJavascript(js2,null);
40
41
42
int delay = 3000;
43
new Handler().postDelayed(new Runnable() {
44
@Override
45
public void run() {
46
47
Toast.makeText(MainActivity.this,"Reached",Toast.LENGTH_LONG).show();
48
final String js3 = "javascript:document.getElementsByClassName('icon')[0].click();";
49
view.evaluateJavascript(js3,null);
50
}
51
},delay);
52
53
} else {
54
view.loadUrl(js);
55
56
}
57
}
58
});
59
activity_main.xml
JavaScript
1
15
15
1
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2
xmlns:app="http://schemas.android.com/apk/res-auto"
3
xmlns:tools="http://schemas.android.com/tools"
4
android:layout_width="match_parent"
5
android:layout_height="match_parent"
6
tools:context=".MainActivity">
7
8
<WebView
9
android:id="@+id/webView"
10
android:layout_height="match_parent"
11
android:layout_width="match_parent"/>
12
13
</RelativeLayout>
14
15
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
JavaScript
1
6
1
private WebView webView;
2
private String uname,password;
3
private int x=0;
4
private CountDownTimer timer;
5
private boolean jsExecuted = false;
6
in callback
JavaScript
1
8
1
@Override
2
public void onPageFinished(WebView view, String url) {
3
super.onPageFinished(view, url);
4
if (jsExecuted) return;
5
jsExecuted = true
6
// JS execution code
7
}
8
btw. you have probably some bug in flow for <19, only first JS will be loaded/executed