2013-03-19 30 views
9

Trong WebView của tôi, tôi có nhiều liên kết trong tiêu đề. Ở chế độ Offline, tôi không được phép tải lại trang và giữ trang đó như hiện tại và sau đó, thông báo cho người dùng về kết nối internet. Tôi có thể bắt các liên kết trước khi tải bằng cách sử dụng shouldOverrideUrlLoading nếu tôi nhấp vào các liên kết khác. Nhưng nếu tôi nhấp vào liên kết tương tự, shouldOverrideUrlLoading sẽ không được kích hoạt, thay vào đó, phương thức onLoadResource sẽ được gọi trước tiên. Trong phương pháp đó tôi đã thử webView.stopLoading(); nhưng nó vẫn tiếp tục hoạt động và bắn onReceivedError phương pháp và hiển thị báo cáo lỗi trên trang.dừng tải trong webViewClient

Đây là WebClient của tôi:

webView.setWebViewClient(new WebViewClient() { 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      if(MyApplication.getInstance().isOnline()) { 
       return false; 
      } 

      Toast.makeText(getApplicationContext(), "Please check Internet connection and try again.", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      Log.i("ON_PAGE_START", "RUNNING ============>" + url); 
      if (MyApplication.getInstance().isOnline()) { 
       super.onPageStarted(view, url, favicon); 
      } else { 
       webView.stopLoading(); 
      } 
     } 

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

      if (MyApplication.getInstance().isOnline()) { 
       super.onLoadResource(view, url); 
      } else { 
       webView.stopLoading();     
      } 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {    

      view.stopLoading(); 

      Toast.makeText(getApplicationContext(), "Please check Internet connection and try again.", Toast.LENGTH_SHORT).show(); 
      super.onReceivedError(view, errorCode, description, failingUrl);  
     } 
    }); 

Những gì tôi muốn là để có thể để đảm bảo rằng các url không bị sa thải nếu nó là ẩn và thông báo về điều đó.

Trả lời

4

Sự cố đã biết của nó và có lỗi được báo cáo. http://code.google.com/p/android/issues/detail?id=2887

Một số giải pháp đã được đề xuất. ví dụ.

  1. Override onPageStarted
  2. Add JavascriptInterface bởi CommonsWare
  3. Disable WebView touch events

Ngoài ra, đăng ký một BroadcastReceiver để nghe mạng thay đổi trạng thái và áp dụng các cách giải quyết khi kết nối bị mất. Network listener Android

+0

Cảm ơn bạn cho câu trả lời tuyệt vời. Vâng, đối với ** 1 **, như bạn có thể thấy trong mã của tôi ở trên, tôi đã ghi đè lên 'onPageStarted' và thử' stopLoading() 'không thành công. ** 2 **, tôi thực sự nghĩ về điều đó, nhưng trong trường hợp của tôi nó có thể là _dangerous_ dựa vào '' từ khi máy chủ có thể thay đổi cấu trúc của trang. Nhưng ** ** thực sự quyến rũ tôi. Làm thế nào nó không đến với tâm trí của tôi, tôi không biết :). Tôi sẽ thử nó vào tuần tới, và cho bạn biết, và có thể đánh dấu câu trả lời là chấp nhận. – boburShox

+0

Xin chào, tôi nghĩ rằng tôi không thể tắt sự kiện cảm ứng, bởi vì tôi phải cache một trong các trang và tải trong chế độ ngoại tuyến. Nếu tôi tắt các sự kiện chạm, thì tôi sẽ không thể tải sự kiện đó hoặc điều gì? Chúng tôi đã đưa ra một ý tưởng cụ thể mà không phải là rất tốt, nhưng phù hợp với nhu cầu của chúng tôi cho thời điểm này. Cảm ơn một lần nữa – boburShox

+0

@boburShox: Vui lòng chia sẻ ý tưởng – LokiDroid

1

Tôi biết bài đăng cũ của nó nhưng nhờ bài đăng này, điều này đã giúp tôi giải quyết vấn đề!

Tôi đã có một vấn đề tương tự và stopLoading giải quyết vấn đề của tôi :)

shouldOverrideUrlLoading được gọi nếu nó đi đến một trang mới hoặc nếu có một chuyển hướng nhưng không phải bằng cách khác như cho click cũ trên iframe vv Tôi muốn đạt được các hành vi tương tự trong ứng dụng của tôi, và tôi nhận ra rằng onPageStarted được gọi nhưng không nênververUrlLoading.

Tôi không ghi đè lênLoadResource nhưng chỉ onPageStarted vì onLoadResource được gọi sau khi onPageStarted. OnPageStarted sẽ kiểm tra xem có ngoại tuyến và không tải trong trường hợp đó hay không. hy vọng điều này sẽ giúp ai đó.

1

Tôi nghĩ rằng trong onLoadRessource (..) và onPageStarted() nó tiếp tục nên

view.stopLoading(); 

trong khác của bạn {..}

Các vấn đề liên quan