프로그래밍 검색 블로그

안드로이드 웹뷰 성능 향상 본문

Android

안드로이드 웹뷰 성능 향상

코딩조무사 2017. 12. 30. 16:44

웹뷰의 성능향상 


간단한 기능으로 웹뷰 사용을 위해서는 크롬을 통한 CustomTab을 활용하는것도 가능하다

참고 https://psbs.tistory.com/90




1
2
//android:hardwareAccelerated="true"
setLayerType(View.LAYER_TYPE_HARDWARE, null);
cs

1. 하드웨어 가속을 통해서 성능을 올린다 

기기에 따라서 차이는 있겠지만 평균적으로 4.4이상이라면 가속이 유리 하다 



1
WebSettings settings = getSettings();
cs


1
2
3
settings.setRenderPriority(WebSettings.RenderPriority.HIGH);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
settings.setEnableSmoothTransition(true);
cs


2. 렌더러 우선순위, 레이아웃 알고리즘, 부드러운 전환 

안드로이드 O 에서는 지원하지 않지만 대부분의 안드로이드에서 동작하므로 넣어준다 





1
2
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
settings.setAppCacheEnabled(true);
cs


3. 캐시

인터넷 연결이 없는 웹뷰라면 NO_CACHE가 낫다 





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    @Override
    public void destroy() {
 
        //현재 웹뷰 메모리누수를 막으려면 수동으로 삭제할수밖에...
        ViewParent parent = this.getParent();
        if(parent instanceof ViewGroup){
           ((ViewGroup) parent).removeView(this);
        }
 
        loadUrl("about:blank");
 
        try{
            removeAllViews();
        }catch (Exception e){
            e.printStackTrace();
        }
 
        super.destroy();
    }
cs


4. 누수 방지 


안드로이드에서 웹뷰의 메모리 누수가 되는 이상한 버그가 있는데 완벽히 막을수는 없겠지만

예외 처리를 해둠으로써 성능을 증가시킨다 수동으로 소속된 뷰에서 removeView를 해준다 




최종 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.example.d.webviewturn;
 
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.webkit.WebSettings;
 
/**
 * Created by d on 2017. 12. 30..
 * 웹뷰 커스텀
 */
 
public class WebViewCustom extends android.webkit.WebView{
    public WebViewCustom(Context context) {
        super(context);
        init();
    }
 
    public WebViewCustom(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
 
    public WebViewCustom(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
 
    public WebViewCustom(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }
 
 
    private void init(){
 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //android:hardwareAccelerated="true"
            //평균적으로 킷캣 이상에서는 하드웨어 가속이 성능이 좋음.
            setLayerType(View.LAYER_TYPE_HARDWARE, null);
        }
 
        WebSettings settings = getSettings();
 
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O) {
            //기기에 따라서 동작할수도있는걸 확인
            settings.setRenderPriority(WebSettings.RenderPriority.HIGH);
 
            //최신 SDK 에서는 Deprecated 이나 아직 성능상에서는 유용하다
            settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
 
            //부드러운 전환 또한 아직 동작
            settings.setEnableSmoothTransition(true);
        }
 
 
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        settings.setAppCacheEnabled(true);
 
 
        loadUrl("about:blank");
    }
 
    @Override
    public void destroy() {
 
        //현재 웹뷰 메모리누수를 막으려면 수동으로 삭제할수밖에...
        ViewParent parent = this.getParent();
        if(parent instanceof ViewGroup){
           ((ViewGroup) parent).removeView(this);
        }
 
        loadUrl("about:blank");
 
        try{
            removeAllViews();
        }catch (Exception e){
            e.printStackTrace();
        }
 
        super.destroy();
    }
}
 
cs


1
2
3
4
    <com.example.d.webviewturn.WebViewCustom
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
cs



1
2
3
4
5
6
7
8
9
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        view = findViewById(R.id.view);
        view.loadUrl("https://google.com");
        view.setWebViewClient(new WebViewClient());
        view.setWebChromeClient(new WebChromeClient());
    }
cs




Comments