2016-03-15 73 views
-1

每当我尝试获取webview的url并尝试在日志中显示我的应用程序崩溃。 这是我的代码... 一切正常,但每次完成页面后崩溃。如何每五秒获取一次webview的URL?

public class MainActivity extends AppCompatActivity { 

String user; 
String password; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Intent i = getIntent(); 
    user = i.getStringExtra("username"); 
    password = i.getStringExtra("password"); 



    final WebView webView = (WebView) findViewById(R.id.webView); 
    final WebSettings webSettings = webView.getSettings(); 
    webSettings.setBuiltInZoomControls(true); 
    webSettings.setJavaScriptEnabled(true); 

    webView.loadUrl("http://www.google.com"); 

    webView.setWebViewClient(new WebViewClient() { 


     @Override 
     public void onPageFinished(final WebView view, String url) { 

      view.loadUrl("javascript: (function() {document.getElementById('ft_un').value= '" + user + "';})();"); 
      view.loadUrl("javascript: (function() {document.getElementById('ft_pd').value= '" + password + "';})();"); 
      view.loadUrl("javascript:(function(){ document.querySelectorAll(\"input[type='submit']\")[0].click();})();"); 


      super.onPageFinished(view, url); 
     } 
    }); 

    new Timer().schedule(new TimerTask() { 
     @Override 
     public void run() { 

      String currentUrl = webView.getUrl(); 
      Log.i("url", currentUrl); 


     } 
    }, 5000); 




} 

}

这是我收到

FATAL EXCEPTION: Timer-0 
                    Process: com.anshuman.cgcautologin, PID: 8609 
                    java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'Timer-0'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {256ea4a6} called on null, FYI main Looper is Looper (main, tid 1) {256ea4a6}) 
                     at android.webkit.WebView.checkThread(WebView.java:2204) 
                     at android.webkit.WebView.getUrl(WebView.java:1293) 
                     at com.anshuman.cgcautologin.MainActivity$2.run(MainActivity.java:62) 
                     at java.util.Timer$TimerImpl.run(Timer.java:284) 
                     Caused by: java.lang.Throwable: A WebView method was called on thread 'Timer-0'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {256ea4a6} called on null, FYI main Looper is Looper (main, tid 1) {256ea4a6}) 
                     at android.webkit.WebView.checkThread(WebView.java:2194) 
                     at android.webkit.WebView.getUrl(WebView.java:1293)  
                     at com.anshuman.cgcautologin.MainActivity$2.run(MainActivity.java:62)  
                     at java.util.Timer$TimerImpl.run(Timer.java:284)  

回答

0

WebView.getUrl()需要在UI线程上运行错误。

new Timer().schedule(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       public void run() { 
        String currentUrl = webView.getUrl(); 
        Log.i("url", currentUrl); 
       } 
      }); 
     } 
    }, 5000); 

甚至更​​好:

webView.postDelayed(new Runnable() { 
    public void run() { 
     String currentUrl = webView.getUrl(); 
     Log.i("url", currentUrl); 
    } 
}, 5000); 

好了,就不再重复。但是,真的,你需要每五秒记录一次吗?覆盖onPageStarted()WebViewClient中,您已经有onPageFinished(),只记录页面加载的开始时间和结束时间。

+0

其实我想要的是当我的应用程序打开它会去大学网站,它会以编程方式填写所有的细节,如用户名,密码,然后它会自动点击登录按钮。这部分工作正常后,我想要的是,我登录后按下按钮每页都会重新加载的页面。请问我应该怎么做 –

+0

我会把'webView.postDelayed()'放在'onPageFinished()'里面。这样,如果页面加载时间超过5秒,它仍然可以正常工作。 –

+0

不,这对我来说无关紧要。问题是我的大学有一些安全性,每1200秒你必须再次登录,但如果我在此之前重新加载我的页面,那么它将再次提供1200秒。所以我想要做的是登录后在我的应用程序会自动重新加载页面在每1100秒和用户不需要登录他们的帐户每次 –