2012-04-03 11 views
5

Witam,ViewPager + WebView, jak zatrzymać ładowanie strony internetowej

Stworzyłem aplikację, która korzysta z ViewPager, a wszystkie strony zawierają WebView. Każdy Webview zawiera obrazy serwerowych, wideo, mp3 ...

Ustawienia Webview są

 public Object instantiateItem(View collection, int position) { 
      . 
      . 
      . 

      final RelativeLayout imageLayout = (RelativeLayout)   
      inflater.inflate(R.layout.omb_webview_layout, null); 
      WebView webview = (WebView) imageLayout.findViewById(R.id.video_view); 
      ProgressBar pbImage = (ProgressBar) imageLayout.findViewById(R.id.progressBar1); 

      webview.requestFocus(View.FOCUS_DOWN); 
      webview.getSettings().setBuiltInZoomControls(false); 
      webview.getSettings().setSupportZoom(true); 
      webview.getSettings().setUseWideViewPort(true); 
      webview.getSettings().setJavaScriptEnabled(true); 
      webview.getSettings().setLoadWithOverviewMode(true); 
      webview.getSettings().setUseWideViewPort(true); 
      webview.setWebViewClient(new mWebViewClient()); 
      webview.getSettings().setPluginsEnabled(true); 
      webview.clearCache(true); 
      webview.clearHistory(); 
      if(Pbar != null) { 
       webview.setWebChromeClient(new WebChromeClient() { 
       public void onProgressChanged(WebView view, int progress)  { 
        Log.i(TAG, "webview loading progress : "+ progress); 
        if(progress == 100) { 
         try { 
          Pbar.setVisibility(ProgressBar.GONE); 
         } catch (Exception e) { 
         Log.e(TAG, "timer progress GONE : "+ progress,e); 
         } 
         } 
      }); 
      } 

Problem jest, gdy strony są następnie przeciągnął także ta linia

Log.i(TAG, "webview loading progress : "+ progress); 

jest wykonywany co oznacza, te wyświetlenia stron internetowych ładują się w tle. Po przesunięciu 4 lub więcej stron ładują się wszystkie wyświetlenia stron.

 destroyItem(View collection, int position, Object o) { 
    Log.d("DESTROY", "destroying view at position sheetal " + position); 

      RelativeLayout view = (RelativeLayout)o; 

        WebView tmp = webviewDictionary.get(position);; 

      tmp.getSettings().setJavaScriptEnabled(false); 
          tmp.stopLoading(); 
     if(tmp != null){ 
         Log.i(TAG, "sheetal webview is destroyed " +position); 
         try { 
          tmp.onPause(); 

          tmp.loadDataWithBaseURL("about:blank", "<html></html>","text/html", "UTF-8", null); 
          tmp=null; 
          // tmp.destroy(); 
         } 
         catch (Exception e) { 
          Log.i(TAG, "webview destroyed Exception 0" ,e); 
         } 
        } 

Jak zatrzymać ładowanie w tle, jeśli strony nie są widoczne? setOffscreenPageLimit (1) (oznacza 3 strony prev, cur, next),

W aplikacji Viewpager 2 strona (oznacza 1 stronę pozycji) nie ładuje się prawidłowo. Pokazuje pustą białą stronę, jak ją rozwiązać?

góry dzięki

+0

Użyłem stopLoading(), ale dawka nie zatrzymać ładowanie w tle, gdy destroyItem (.. .) nazywa się webview zatrzymać prawo ładowania? ale nie zatrzymuj ładowania. –

+0

Nie do końca pewny, ale czy nie trzeba ustawić OffscreenPageLimit na 0? – THelper

+0

Próbowałem pager.OffscreenPageLimit (0), ale nie działa. –

Odpowiedz

2

to rozwiązało mój problem.

Stworzyłem słownik, który zawiera 3 widoki internetowe z pozycją jako klucz.

tutaj dodaję WebViews w słowniku

public Object instantiateItem(View collection, int position) { 
    . 
    . 
    . 
    webviewDictionary.put(position, webView); 
    . 
    . 
    . 
} 

czyszczenia WebViews jest ze słownika

public void cleanAllWebViews() { 

    try { 

     if(webviewDictionary != null){ 

      Iterator<Integer> webViewIterator = webviewDictionary.keySet().iterator(); 

      while(webViewIterator.hasNext()) { 

       Integer key=(Integer)webViewIterator.next(); 

       WebView webView = (WebView) webviewDictionary.get(key); 


       webView.stopLoading(); 
       //     webView.pauseTimers(); 

       webView.setWebChromeClient(null); 
       webView.setWebViewClient(null); 


       webView.loadDataWithBaseURL("about:blank", "<html></html>","text/html", "UTF-8", null); 
       webViewIterator.remove(); 

      } 
     } 

     webviewDictionary = null; 


    }catch (Exception e) { 
     Log.e(TAG, "ombook last call onPauseAllWebviews Exception",e ); 
    } 
} 

    and 

    @Override 
public void onBackPressed() { 

    cleanAllWebViews(); 

    System.gc(); 

    super.onBackPressed(); 
} 
1

próbowałeś "OffscreenPageLimit" jest ustawiony na 1? 0 jest nieprawidłową wartość według tego postu: ViewPager.setOffscreenPageLimit(0) doesn't work as expected

również, czy próbowałeś obsługiwać niektóre zdarzenia przełączania między stronami, tak, że po każdym włączeniu strony, WebView bieżąca strona będzie powstrzymać załadunek lub początek ładowanie pustego pliku html?

+1

tak, podczas nawigacji po stronach mam wstrzymywanie widoku (webview.onPause()) –

+1

czy to działa? jeśli tak, czy możesz opublikować odpowiedni kod? –

Powiązane problemy