我正在制作一个应用程序,可以自动在webview中执行某些操作。
我想在内部的两行之间暂停(for-loop),直到页面加载完毕而不使用Thread.sleep,因为它冻结了我的应用程序。
这是我的代码:
webview.loadUrl("http://**********");
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
for(int i=1;i<10;i++){
evaluateJavascript( "document.getElementById('select').value=" + i)
evaluateJavascript("document.getElementById('Search').click();")
//wait until finished loading
while( isloading() ){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
evaluateJavascript( "document.getElementById('any_select').value=5")
.
.
.
.
}
public boolean isloading(){
boolean isloading;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webview.evaluateJavascript("(function() { return document.getElementById(\"Loading\").style.display; })();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
if(s.equals("none")){
isloading=false;
}else{
isloading=true;
}
}
});
}
if(isloading=true)return true;
if(isloading=false)return false;
}
答案 0 :(得分:1)
如果您不想使用Thread.sleep,那么另一种方法是在您的应用程序中使用AsyncTask。
您可以在AsyncTask的doInBackground()方法中执行加载任务,并使用新的AsyncTaskClass.execute()调用它;
您可以从此处查看:http://developer.android.com/reference/android/os/AsyncTask.html
答案 1 :(得分:0)
你可以做类似的事情(而不是AsyncTask):
修改强>
Timer timer = new Timer();
while( isloading() ){
try {
timer.schedule( new TimerTask(){
public void run() {
//
}
}, delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
答案 2 :(得分:0)
如果你想实现,我的理解,一旦你的第二行被调用,你想停在那里,并在1000毫秒后你想继续。您可以做一件事,在第二行之后复制所有代码并将其放在下面代码的run方法中:
new Handler().postDelayed(new Runnable()
{
@Override
public void run() {
}
}, 1000);
它将在1000ms后执行代码
答案 3 :(得分:0)
如果你想在UIThread和背景线程中按顺序执行动作,你应该通过Parse / Facebook寻找Bolt Library。
它将Javascript承诺应用于Android应用程序。