Miałem ten sam problem i musiałem to rozwiązać. Wypróbowałem te rozwiązania, ale ostatecznie wydajność, przynajmniej przy przewijaniu, wcale się nie poprawiła. A więc tutaj obejście, które wykonałem, i wyjaśnienie, dlaczego zadziałało.
Jeśli miałeś okazję zbadać zdarzenia przeciągania, tylko trochę, tworząc klasę "MiWebView", nadpisując metodę "onTouchEvent" i przynajmniej wypisując czas, w którym występuje każde zdarzenie przeciągania, zobaczysz, że są one oddzielone w czasie do (do) 9 ms dalej. To bardzo krótki czas pomiędzy wydarzeniami.
Spójrz na kod źródłowy WebView i po prostu zobacz funkcję onTouchEvent. Po prostu niemożliwe jest, aby procesor mógł to obsłużyć w czasie krótszym niż 9 ms (Śnij dalej !!!). Dlatego ciągle widzisz komunikat „Przegap się, ponieważ czekamy na odpowiedź WebCore na lądowanie”. wiadomość. Kod po prostu nie może być obsłużony na czas.
Jak to naprawić? Po pierwsze, nie możesz ponownie napisać kodu onTouchEvent, aby go ulepszyć, to po prostu za dużo. Możesz jednak „kpić z tego”, aby ograniczyć częstotliwość zdarzeń w przypadku ruchów przeciągania, powiedzmy do 40 ms lub 50 ms. (zależy to od procesora).
Wszystkie zdarzenia dotykowe wyglądają tak: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Musimy więc zachować ruchy W DÓŁ i W GÓRĘ oraz filtrować tempo RUCHU (to są źli ludzie).
A oto sposób na zrobienie tego (możesz dodać więcej typów zdarzeń, takich jak dotknięcie dwoma palcami, wszystko, co mnie interesuje, to przewijanie jednym palcem).
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;
}
}
Oczywiście użyj tej klasy zamiast WebView, a zobaczysz różnicę podczas przewijania.
To tylko podejście do rozwiązania, ale wciąż nie w pełni zaimplementowane we wszystkich przypadkach opóźnienia z powodu dotykania ekranu podczas korzystania z WebView. Jest to jednak najlepsze rozwiązanie, jakie znalazłem, przynajmniej dla moich konkretnych potrzeb.