如何在for循环中睡觉直到完成加载页面android

时间:2015-11-02 09:14:39

标签: java android for-loop webview

我正在制作一个应用程序,可以自动在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;


}

4 个答案:

答案 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应用程序。

您可以从此处查看:https://github.com/BoltsFramework/Bolts-Android