WebViewPool, последняя html-страница отображается перед новым URL при повторном использовании WebView из WebViewPool - PullRequest
0 голосов
/ 21 марта 2019

Существует WebViewPool , когда действие / фрагмент уничтожается, веб-просмотр будет сброшен и добавлен в WebViewPool.

Ниже приведен код WebViewPool:


public class WebViewPool {

  private static volatile WebViewPool sINSTANCE;
  private int mMaxSize;

  private List<WebView> mAvailableList;
  private List<WebView> mInUsedList;
  private IWebViewPoolFactory mFactory;

  private WebViewPool() {

  }

  public static WebViewPool getInstance() {
    if (sINSTANCE == null) {
      synchronized (WebViewPool.class) {
        if (sINSTANCE == null) {
          sINSTANCE = new WebViewPool();
        }
      }
    }
    return sINSTANCE;
  }

  public void init(IWebViewPoolFactory factory,boolean lazy) {
    init(2, factory,lazy);
  }

  public void init(int maxSize, IWebViewPoolFactory factory,boolean lazy) {
    mMaxSize = maxSize;
    mFactory = factory;
    mAvailableList = new ArrayList<>(maxSize);
    mInUsedList = new ArrayList<>(maxSize);
    if (!lazy) {
      create();
    }
  }


  private synchronized void create() {
    if (mFactory == null) {
      return;
    }
    for (int i = 0; i < mMaxSize; i++) {
      WebView webView = mFactory.create(new MutableContextWrapper(APP.getApplicationContext()));
      mAvailableList.add(webView);
    }
  }

  /**
   * get webview form pool
   * @param context
   * @return
   */
  public synchronized WebView getWebView(Context context) {
    if(!(context instanceof Activity)){
      throw new IllegalStateException("Context must be Activity");
    }
    WebView webView = null;
    if (mAvailableList.size() > 0) {
      webView = mAvailableList.remove(0);

    } else {
      if (mFactory != null) {
        webView = mFactory.create(new MutableContextWrapper(APP.getApplicationContext()));
      }
    }
    if (webView != null) {
      ((MutableContextWrapper) webView.getContext()).setBaseContext(context);
      mInUsedList.add(webView);
    }
    return webView;
  }

  /**
   * reset/destroy webview when activity/fragemnt is destroyed
   * @param webView
   */
  public synchronized void restWebView(WebView webView) {
    if (webView == null || mFactory == null) {
      return;
    }
    mFactory.reset(webView);
    ((MutableContextWrapper) webView.getContext()).setBaseContext(APP.getApplicationContext());
    if (mInUsedList.contains(webView)) {
      mInUsedList.remove(webView);
      if (mAvailableList.size() < mMaxSize) {
        mAvailableList.add(webView);
      } else {
        mFactory.destroy(webView);
      }
    } else {
      mFactory.destroy(webView);
    }
  }
}

ниже приведен код функции reset:

    public void reset(WebView webView) {
        if(webView==null){
            return;
        }
        ViewParent viewParent = webView.getParent();
        if (viewParent!=null) {
            ((ViewGroup)viewParent).removeView(webView);
        }
        webView.stopLoading();
        webView.clearCache(false);
        webView.loadUrl("about:blank");
        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
            @Override
            public void run() {
                webView.clearHistory();
            }
        }, 1000);
    }

Но при повторном использовании веб-просмотра последняя html-страница иногда показывается первой перед новым url. Это не происходит каждый раз.Я искал в гугле, но не работает. Кто-нибудь знает причину?Спасибо!

1 Ответ

0 голосов
/ 25 марта 2019

Эта проблема окончательно решена!Причина в том, что добавьте сброшенный WebView в список доступных, пока about:blank не загружен, чтобы clearHistory() не работал.

Итак, сбросьте веб-просмотр, но не добавляйте его в список доступных, когда активность / фрагмент уничтожен, вызовите clearHistory() в onPageFinished(), когда url равен about:blank:

@Override
public void onPageFinish(String url, boolean success) {
    if("about:blank".equals(url)){
        webView.clearHistory();
        //then add the webview to available list;
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...