안드로이드 웹뷰 느림 JQuery마법 을 사용해야하는 전화

나는 android webviews느리다. 이것은 3.0+적절한 사양 이상의 전화기에서 태블릿 에 이르기까지 모든 것에 있습니다.

나는 웹뷰가 “제한적”이어야한다는 것을 알고 있지만 모든 종류 CSS3JQuery마법 을 사용해야하는 전화 갭으로 웹 앱을 볼 수 있습니다.

그래서 뭔가 빠졌 myWebview.SPEEDHACK(1)습니다. 속도를 높이기 위해 사용할 수있는 것이 있습니까?

또한 때로는 내 웹보기의 내용이 단순히로드되지 않고 단순히로드되지 않고로드되지 않습니다. 테스트중인 자산은 오류없이 로컬에 저장됩니다.



답변

로드되는 웹 응용 프로그램에 따라 다릅니다. 아래 접근법 중 일부를 시도하십시오.

더 높은 렌더링 우선 순위 설정 (API 18+에서 더 이상 사용되지 않음) :

webview.getSettings().setRenderPriority(RenderPriority.HIGH);

하드웨어 가속 활성화 / 비활성화 :

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    // chromium, enable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
    // older android version, disable hardware acceleration
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

캐시를 비활성화합니다 (콘텐츠에 문제가있는 경우).

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);


답변

android:hardwareAccelerated="true"매니페스트에 이것을 추가 하면 성능이 크게 향상되었습니다.

자세한 정보는 여기 :
http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel


답변

우리를위한 해결책은 정반대였습니다. 이 코드를 사용하여 매니페스트의 전체 앱이 아닌 WebView에서만 하드웨어 가속을 비활성화했습니다.

if (Build.VERSION.SDK_INT >= 11){
    webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

CSS3 애니메이션이 더 매끄 럽습니다. 우리는 안드로이드 4.0을 사용하고 있습니다.

자세한 내용은 https://code.google.com/p/android/issues/detail?id=17352


답변

다음이 가장 효과적이라고 생각합니다.

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

Android 19에는 WebView 용 Chromium 엔진이 있습니다. 하드웨어 가속으로 더 잘 작동한다고 생각합니다.


답변

나는이 같은 문제가 있었고 그것을 해결해야했습니다. 나는이 솔루션을 시도했지만 결국 스크롤링의 성능은 전혀 향상되지 않았습니다. 그래서 여기에 내가 수행 한 작업과 그것이 나를 위해 일한 이유에 대한 설명이 있습니다.

“MiWebView”클래스를 작성하고 “onTouchEvent”메소드를 덮어 쓰고 최소한 모든 드래그 이벤트가 발생하는 시간을 인쇄하여 드래그 이벤트를 탐색 할 기회가있는 경우, 분리 된 것을 볼 수 있습니다 9ms 떨어진 시간까지. 이벤트 사이에 아주 짧은 시간입니다.

WebView 소스 코드를 살펴보고 onTouchEvent 함수를 참조하십시오. 프로세서가 9ms 미만으로 처리하는 것은 불가능합니다. 그렇기 때문에 “WebCore의 터치 다운에 대한 응답을 기다리는 동안 드래그가 발생하지 않습니다.” 메시지. 코드는 제 시간에 처리 할 수 ​​없습니다.

고치는 방법? 첫째, onTouchEvent 코드를 다시 작성하여 향상시킬 수는 없습니다. 그러나 움직임을 드래그하는 이벤트 속도를 40ms 또는 50ms로 제한하기 위해 “모의”할 수 있습니다. (프로세서에 따라 다름)

모든 터치 이벤트는 다음과 같습니다 : ACTION_DOWN-> ACTION_MOVE …… ACTION_MOVE-> ACTION_UP. 따라서 우리는 DOWN 및 UP 움직임을 유지하고 MOVE 비율을 필터링해야합니다 (이것은 나쁜 사람들입니다).

그리고 여기에 그것을하는 방법이 있습니다 (두 손가락 터치와 같은 더 많은 이벤트 유형을 추가 할 수 있습니다. 여기서 관심있는 것은 단일 손가락 스크롤뿐입니다).

import android.content.Context;
import android.view.MotionEvent;
import android.webkit.WebView;


public class MyWebView extends WebView{

    public MyWebView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    private long lastMoveEventTime = -1;
    private int eventTimeInterval = 40;

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        long eventTime = ev.getEventTime();
        int action = ev.getAction();

        switch (action){
            case MotionEvent.ACTION_MOVE: {
                if ((eventTime - lastMoveEventTime) > eventTimeInterval){
                    lastMoveEventTime = eventTime;
                    return super.onTouchEvent(ev);
                }
                break;
            }
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_UP: {
                return super.onTouchEvent(ev);
            }
        }
        return true;
    }
}

물론 WebView 대신이 클래스를 사용하면 스크롤 할 때 차이점이 나타납니다.

이것은 솔루션에 대한 접근 방식이지만 WebView를 사용할 때 화면 터치로 인해 모든 지연 사례에 대해 완전히 구현되지는 않았습니다. 그러나 적어도 내 특정한 요구에 대해서는 내가 찾은 최고의 솔루션입니다.


답변

phonegap 앱에서 렌더링 성능 문제를 해결하기 위해 모든 제안을 시도했습니다. 그러나 실제로는 효과가 없었습니다.

마지막으로, 하루 종일 검색을 한 후 검색했습니다. 내 AndroidManifest의 태그 (태그 아님) 내에 설정했습니다.

<application android:hardwareAccelerated="false" ...

이제 앱이 웹 브라우저와 동일한 방식으로 작동합니다. 하드웨어 가속이 항상 가장 좋은 기능은 아닌 것 같습니다 …

내가 가진 자세한 문제 : https : //.com/a/24467920/3595386


답변

그 답변 중 어느 것도 나에게 도움이되지 않았습니다.

마지막으로 이유와 해결책을 찾았습니다. 그 이유는 CSS3 필터 (필터, -webkit-filter)가 많기 때문입니다.

해결책

HTML 본문에 “저품질”클래스를 추가하기 위해 웹 페이지 스크립트에 WebView 감지 기능을 추가했습니다. BTW. WebView 설정에서 user-agent를 설정하여 WebView를 쉽게 추적 할 수 있습니다. 그런 다음 새로운 CSS 규칙을 만들었습니다.

body.lowquality * { filter: none !important; }