代码之家  ›  专栏  ›  技术社区  ›  igor_rb

导航架构组件缓存WebView内容

  •  0
  • igor_rb  · 技术社区  · 7 年前

    我在我的应用程序中通过 Navigation Architecture Component https://developer.android.com/topic/libraries/architecture/navigation/

    我有一个 MainActivity 在里面交换碎片。

    public class MainActivity extends AppCompatActivity {
      NavController mNavController;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
    
        ..... 
        Navigation.findNavController(this, R.id.my_nav_host_fragment);
        .....
      }
    
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.map: {
                mNavController.navigate(R.id.action_global_mapFragment);
                break;
            }
        }
        return super.onOptionsItemSelected(item);
      }
    }
    

    在MapFragment中,我有类似的东西(用iframes加载HTML):

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
      ......
      mWvMap.setWebChromeClient(new WebChromeClient());
      ....
      mWvMap.loadData("<html>\n" +
                    "<head>\n" +
                    "</head>\n" +
                    "<body style=\"margin: 0\">\n" +
                    ......
    
    }
    

    我的问题是:每次当我点击工具栏中的地图图标时, mNavController.navigate(R.id.action_global_mapFragment); 调用,每次创建新的MapFragment,每次加载重量级HTML数据。

    我怎样才能缓存它? 我无法将webview状态存储在 onPause ,因为片段每次都重新创建。 我可以安装吗? NavigationController 为了避免这个?

    或者其他可能的解决方案?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Alex    7 年前

    Navigate方法总是创建片段的新实例,您可以尝试使用Web缓存:

    mWvMap.setAppCacheEnabled(true); 
    mWvMap.setAppCachePath(getBaseContext().getCacheDir().getPath());