2011-10-14 19 views
16

Tôi đang làm việc với phonegap và Android và có tệp .html và js của tôi trên máy chủ bên ngoài. Khi tôi sử dụng đoạn mã sau, ứng dụng tải file .html bên ngoài của tôi và tất cả mọi thứ hoạt động tốt:đặt loadURLTImeOutValue trên webview

this.setIntegerProperty("loadUrlTimeoutValue", 60000); 
this.loadUrl("http://www.myserver.com"); 

Tuy nhiên, khi làm việc thông qua một webview tôi có thể không có vẻ để thiết lập loadURLTimeoutValue cho một webview:

private WebView webView; 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    try { 
     webView = (WebView) findViewById(R.id.webview);  
     webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
     webView.loadUrl("http://www.myserver.com");  
    } 

Điều này không hiệu quả. Làm cách nào để đặt giá trị thời gian chờ trên webview?

Trả lời

26

Đây là giải pháp để mô phỏng hành vi được mô tả. Bạn có thể sử dụng một WebViewClient, và ghi đè lên onPageStarted phương pháp:

public class MyWebViewClient extends WebViewClient { 
    boolean timeout; 

    public MyWebViewClient() { 
     timeout = true; 
    } 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       if(timeout) { 
        // do what you want 
       } 
      } 
     }).start(); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     timeout = false; 
    } 
} 

Nếu thời gian chờ, bạn có thể tải, ví dụ, một trang lỗi ...

Để thêm các WebViewClient cho bạn WebView, chỉ cần làm điều này :

webView.setWebViewClient(new MyWebViewClient()); 
+0

này là không khả thi nếu trang web được nửa nạp ... – mohitum

+0

Nếu có một thời gian chờ, bạn có thể thử thêm một số điều khiển bên trong 'tuyên bố if' để xác minh nếu trang web được nửa nạp –

+0

Có một vấn đề nếu một trang tải thành công và nếu bạn tải một trang khác khi luồng chưa chạy xong ... Ngoài ra, hàm tạo của bạn không đúng và bạn nên đặt thời gian chờ thành true trong phương thức 'onPageStarted'! – andreas

12

tôi sử dụng này để thiết lập một thời gian ra cho WebView tôi:

public class MyWebViewClient extends WebViewClient { 

    boolean timeout = true; 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     Runnable run = new Runnable() { 
      public void run() { 
       if(timeout) { 
        // do what you want 
        showAlert("Connection Timed out", "Whoops! Something went wrong. Please try again later."); 
       } 
      } 
     }; 
     Handler myHandler = new Handler(Looper.myLooper()); 
     myHandler.postDelayed(run, 5000); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     timeout = false; 
    } 
} 
+0

"myHandler" đề cập đến điều gì ở đây? tôi đã thử giải pháp trước giải pháp của bạn, nhưng mã tôi muốn chạy gây ra ngoại lệ cho biết tôi cần chạy mã của mình trong chuỗi giao diện người dùng. Giải pháp của bạn sử dụng phương thức "postDelayed", theo lý thuyết nên chạy mã trong chuỗi giao diện người dùng, đúng không? im chỉ nhầm lẫn với những gì "myHandler" ở phía trước của "postDelayed" là gì? bạn có thể lấy mẫu ví dụ ra bằng mã myHandler hay một ví dụ đơn giản về cách bạn định nghĩa mã myhandler. – user280109

+0

myHandler có lẽ được khởi tạo là trình xử lý mới() trong luồng chính (UI). Xem tài liệu Android về Handler và Looper để biết thêm thông tin.Nó không rõ ràng từ tài liệu cho dù onPageFinished() sẽ được gọi trong mọi trường hợp - ví dụ: nếu xảy ra lỗi hoặc thực hiện cuộc gọi WebView.stopLoading(). – MZB

+0

myHandler = Trình xử lý mới (Looper.myLooper()); – Rodrigo

2

Nếu bạn mở rộng CordovaWebView, mà bạn nên để có được API PhoneGap, bạn có thể chỉ cần sử dụng như sau:

this.getIntent().putExtra("loadUrlTimeoutValue", 60000); 

Bên trong, CordovaWebView thực hiện một cơ chế thời gian chờ tương tự như những đề xuất trong bài trước (mặc định timeout = 2000).

Hãy nhớ rằng đây không phải là giao diện được tài liệu, do đó, nó có thể bị hỏng trong tương lai.

6

Cách đúng để thay đổi mặc định timeout đang sử dụng thẻ <preference /> trong file config.xml, ví dụ:

<preference name="loglevel" value="DEBUG" /> 
<preference name="loadUrlTimeoutValue" value="60000" /> 
<preference name="errorUrl" value="file:///android_asset/www/connection_error.html" /> 

Đối với tùy chọn ưu tiên hơn, hãy tham khảo Android Configuration.

0
WebView mWebView = findViewById(R.id.web_view); 
mWebView.setWebViewClient(new WebViewClient() { 
    private final Handler handler = new Handler(); 
    private volatile boolean timeout; 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     super.onPageStarted(view, url, favicon); 

     timeout = true; 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       if(timeout) { 
        handler.post(new Runnable() { 
         @Override 
         public void run() { 
          // do what you want with UI           
         } 
        }); 
       } 
      } 
     }).start(); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 

     timeout = false; 
    } 
}); 
Các vấn đề liên quan