Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- program
- WebView
- AES
- Chrono
- async
- Observer
- sha256
- traits
- SHA1
- stringprintf
- coroutines
- template
- sprintf
- type_traits
- RAII
- CustomTab
- haskell
- Reflect
- ChromeTab
- Functional
- go
- design pattern
- SHA512
- web
- ranges
- Clojure
- c++
- Scala
- kotlin
- Android
Archives
- Today
- Total
프로그래밍 검색 블로그
안드로이드 웹뷰 성능 향상 본문
웹뷰의 성능향상
간단한 기능으로 웹뷰 사용을 위해서는 크롬을 통한 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 |
'Android' 카테고리의 다른 글
안드로이드 WebView 대신 Chrome Tab 사용 (1) | 2019.03.23 |
---|---|
코틀린 파일 MD5 SHA1 SHA256 SHA512 (0) | 2018.05.30 |
코틀린 비동기 async (0) | 2018.02.16 |
안드로이드 SQLite 사용 Create, Index (0) | 2018.02.12 |
안드로이드 REST API / JSON 파싱 (0) | 2017.12.31 |
Comments