Intereting Posts
Только исходный поток, создавший иерархию представлений, может коснуться его представлений Как я могу заставить атрибут fgcolor работать в последних версиях Android? Ошибка экспорта ADT с помощью Gradle Приложение Google приглашает Unity3D Plugin Json File Location Установите абсолютное положение вида Как изящно проверить, нет ли сырого ресурса? Как получить рабочий динамический текст ToggleButton под андроид? Не удалось найти свойство «компилировать» на org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler_Decorated@397740e0 Не удалось найти com.google.android.gms: play-services: 3.1.59 3.2.25 4.0.30 4.1.32 4.2.40 4.2.42 4.3.23 4.4.52 5.0.77 5.0.89 5.2.08 6.1. 11 6.1.71 6.5.87 Приемник смены режима звонка Широковещательный приемник? Android – Захват событий «Готово» и «Ввод» на мягкой клавиатуре Цвет фона AndroidView WebView: прозрачный игнорируется на Android 2.2 PACKAGE_ADDED BroadcastReceiver не работает Уровень n Расширяемый список просмотров RecyclerView с GridLayoutManager пытается решить wrap_content

Логика для использования нескольких веб-просмотров в TabLayout для решения проблемы памяти

У меня почти 30 веб-просмотров в Tablayout. Все работает отлично, но мое приложение потребляет много памяти и будет просто закрываться из-за проблемы с памятью. Это то, что я получаю в журнале

04-05 21:00:09.458 19720-19801/com.example.choman.webview A/chromium: [FATAL:memory.cc(19)] Out of memory. size=16777216 

Это мой java-файл. В основном все остальные 29 фрагментов содержат один и тот же код с просто изменением URL-адреса. Я не уверен, как справиться с этим.

 public class stackOverflow extends Fragment { private WebView webView; private ProgressBar progressBar1; private SwipeRefreshLayout mSwipeRefreshLayout1; public stackOverflow() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_tab1, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { progressBar1 = (ProgressBar) view.findViewById(R.id.progressBar1); webView = (WebView) view.findViewById(R.id.website_detail_1); webView.setWebViewClient(new MyAppWebViewClient()); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setDomStorageEnabled(true); webView.loadUrl("http://www.stackoverflow.com"); WebSettings webSettings = webView.getSettings(); webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); webView.getSettings().setAppCacheEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); mSwipeRefreshLayout1 = (SwipeRefreshLayout) view.findViewById(R.id.swipe1); mSwipeRefreshLayout1.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { webView.loadUrl("http://www.stackoverflow.com"); } }); if (mSwipeRefreshLayout1.isRefreshing()) { mSwipeRefreshLayout1.setRefreshing(false); } webView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { webView.goBack(); return true; } return false; } }); } public class MyAppWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //view.findViewById(R.id.progressBar1).setVisibility(View.GONE); Log.i("pageFinished", "yesss"); //progressBar.setVisibility(View.INVISIBLE); progressBar1.setVisibility(View.GONE); if (mSwipeRefreshLayout1.isRefreshing()) { mSwipeRefreshLayout1.setRefreshing(false); } } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } } 

Основная деятельность

 public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { public WebView view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); tabLayout.addTab(tabLayout.newTab().setText("WebView1").setTag("WebView1")); //all the way down to ..... tabLayout.addTab(tabLayout.newTab().setText("WebView30").setTag("WebView30")); final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); viewPager.setOffscreenPageLimit(6); final PagerAdapter adapter = new TabPagerAdapter(getSupportFragmentManager(), tabLayout .getTabCount()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener( tabLayout)); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); } @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. // int id = item.getItemId(); // //noinspection SimplifiableIfStatement // if (id == R.id.action_settings) { // return true; // } return super.onOptionsItemSelected(item); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { ViewPager viewPager = (ViewPager) findViewById(R.id.pager); // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.WebView1) { viewPager.setCurrentItem(0); //all the way down to..30 if (id == R.id.WebView30) { viewPager.setCurrentItem(30); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } } 

Это код для TabPagerAdapter

 public class TabPagerAdapter extends FragmentStatePagerAdapter { int tabCount; public TabPagerAdapter(FragmentManager fm, int numberOfTabs) { super(fm); this.tabCount = numberOfTabs; } @Override public Fragment getItem(int position) { switch (position) { case 0: // WebViewFragment1 tab1 = new WebViewFragment1(); return tab1; //all the way to tab 29 webViewFragment30 tab30 = new WebViewFragment30(); return tab30 default: return null; } } @Override public int getCount() { return tabCount; } } 

Solutions Collecting From Web of "Логика для использования нескольких веб-просмотров в TabLayout для решения проблемы памяти"

Используйте ViewPager . ViewPager будет хранить максимум 3 фрагмента в памяти в любое время (без изменения значения по умолчанию за пределами ViewPager ). 3 фрагмента представляют собой текущий видимый фрагмент, левый и правый фрагменты к текущему фрагменту.

Если вам нужны вкладки, вы можете создать пользовательский вид, который выглядит как системные вкладки и добавить его над ViewPager. Используйте PageTransformer с ViewPager для отслеживания прокрутки ViewPager и прокрутки пользовательской ViewPager . Затем прослушайте клики вкладки и прокрутите ViewPager на основе нажатой ViewPager .

Обновить:

Я полностью забыл, что мы могли бы подключить TabLayout с помощью ViewPager вместо создания пользовательских вкладок.

tabLayout.setUpWithViewPager(viewpager) будет работать.

Благодаря @choman

Цитируя ваш комментарий, «я использую только один веб-просмотр в приложении, но моя веб-страница имеет размер 6.5 МБ, поэтому это была основная причина сбоя приложения».

Если ваша веб-страница размером 6,5 МБ, моя догадка заключается в том, что она связана с изображениями высокого качества высокого качества. Если это так, вы должны рассмотреть возможность уменьшения размера изображений путем уменьшения масштаба / уменьшения дискретизации изображений. Уменьшение масштаба изображений на стороне сервера намного лучше, чем в мобильном телефоне после загрузки (потеря полосы пропускания, процессор, батарея).

viewPager.setOffscreenPageLimit(6); Эта строка вызывает проблему. Эта строка сообщает пейджеру просмотра хранить (6 + 6 + 1 = 13) страниц в памяти, что должно быть дорогостоящим в вашем случае, так как каждая страница имеет 6.5 Мб содержимого. Вам нужно изменить его на viewPager.setOffscreenPageLimit(1) чтобы исправить проблему OutOfMemory.

WebView – тяжелый компонент.

Я бы рекомендовал изменить ваше приложение для работы с одним веб-просмотром и изменением URL-адреса в нем вместо использования нескольких веб-страниц.

Вы можете использовать android: largeHeap = "true", чтобы запросить больший размер кучи, но это не будет работать на каких-либо устройствах предварительной сотовой связи. На устройствах версии 2.3 вы можете использовать класс VMRuntime, но это не будет работать на Gingerbread и выше.

Это связано с тем, что для вашего приложения требуется больше места для запуска. Я думаю, это поможет вам решить текущую проблему. –как использовать–

 <application .... android:largeHeap="true" > 

благодаря