Viewpager Webview memory issue

后端 未结 3 1799
北荒
北荒 2020-12-15 11:37

I\'m using a viewpager to load around 50 webviews... All the webviews are loaded into assests and each weview has an HTML page that is accessing around 70 images each... As

相关标签:
3条回答
  • 2020-12-15 11:53

    Try to scale down bitmap.Most of the time Bitmap is a main reason we get Memory issue. Also learn about how to recycle the bitmaps. Following snippet will help you.

    BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile( filename, options );
            options.inJustDecodeBounds = false;
            options.inSampleSize = 2; 
    
            bitmap = BitmapFactory.decodeFile( filename, options );
            if ( bitmap != null && exact ) {
                bitmap = Bitmap.createScaledBitmap( bitmap, width, height, false );
            }
    

    Also make sure you did override following method.

    @Override
    public void destroyItem(View collection, int position, Object view) {
        ((ViewPager) collection).removeView((TextView) view);
    }
    

    Or you can create a function to Scale Down Bitmap

    private byte[] resizeImage( byte[] input ) {
    
        if ( input == null ) {
            return null;
        }
    
        Bitmap bitmapOrg = BitmapFactory.decodeByteArray(input, 0, input.length);
    
        if ( bitmapOrg == null ) {
            return null;
        }
    
        int height = bitmapOrg.getHeight();
        int width = bitmapOrg.getWidth();
        int newHeight = 250;
    
        float scaleHeight = ((float) newHeight) / height;
    
        // creates matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleHeight, scaleHeight);
    
        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,
                width, height, matrix, true);
    
        bitmapOrg.recycle();
    
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        resizedBitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos);            
    
        resizedBitmap.recycle();
    
        return bos.toByteArray();            
    }       
    
    0 讨论(0)
  • 2020-12-15 11:53

    Setting layer type of webview to software works.

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }
    

    But now you lose hardware acceleration and your webview may slow down.

    0 讨论(0)
  • 2020-12-15 12:19

    The WebView works with the JNI and this can only hold 512 local references, try loading your content directly from web and the problem shouldn't occur.

    I get this problem when I override shouldInterceptRequest(WebView view, String url) in webviewclient and hand local references from my own caching mechanism.

    This might be a bug in the webview itself. At least it isn't how it should behave if you ask me.

    0 讨论(0)
提交回复
热议问题