这份代码是直接继承WebView了,重载了其中的几个方法,至于为什么这样做时候,PhoneGap性能能得到比较明显的提升,不懂的可以看我前面的那篇文章。
至于如何使用这份代码,只要了解PhoneGap的同学想必都知道的,只需要使用一个WebViewPlus的实例来加载你自己的html地址即可。经过测试发现,其实这样的改进方案还是能一定程度上改善PhoneGap在Android上点击响应缓慢的问题的。
代码如下:
public class WebViewPlus extends WebView
{
public boolean optimizeShortPressEnabled = true;
public boolean optimizeFlingEnabled = true;
public boolean getMoving()
{
return (Boolean) this.getPrivateObject("mConfirmMove");
}
public Handler getPrivateHandler()
{
return (Handler) this.getPrivateObject("mPrivateHandler");
}
public void OptimizedShortPress()
{
Handler handler = this.getPrivateHandler();
if (handler.hasMessages(5))
handler.removeMessages(5);
Method method = this.getPrivateMethod("doShortPress", new Class[]{});
this.invokeMethod(method);
}
public void OptimizedFling(MotionEvent ev)
{
Long lastTime = (Long) this.getPrivateObject("mLastTouchTime");
if (ev.getEventTime() - lastTime > 250L)
{
this.setPrivateObject("mTouchMode", Integer.valueOf(3));
}
}
public void Initialize()
{
optimizeShortPressEnabled = true;
optimizeFlingEnabled = true;
}
public WebViewPlus(Context context) {
super(context);
this.Initialize();
}
public WebViewPlus(Context context, AttributeSet attrs) {
super(context, attrs);
this.Initialize();
}
public WebViewPlus(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.Initialize();
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
if (optimizeFlingEnabled && getMoving())
{
this.OptimizedFling(ev);
}
boolean result = super.onTouchEvent(ev);
if (optimizeShortPressEnabled && ev.getAction() == MotionEvent.ACTION_UP && !getMoving())
{
this.OptimizedShortPress();
}
return result;
}
public Method getPrivateMethod(String methodName, Class[] paramClasses)
{
return getPrivateMethod(this, methodName, paramClasses);
}
public static Method getPrivateMethod(Object objectClass, String methodName, Class[] paramClasses)
{
try {
Method theMethod = objectClass.getClass().getSuperclass().getDeclaredMethod(methodName, paramClasses);
return theMethod;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public Object invokeMethod(Method method, Object[] paramObjects)
{
return WebViewPlus.invokeMethod(this, method, paramObjects);
}
public Object invokeMethod(Method method)
{
return WebViewPlus.invokeMethod(this, method, new Object[] { });
}
public Object invokeMethod(String methodName)
{
try
{
Method method = this.getPrivateMethod(methodName, new Class[] { });
method.setAccessible(true);
return method.invoke(this, new Object[] { });
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public static Object invokeMethod(Object objectClass, Method method, Object[] paramObjects)
{
try
{
method.setAccessible(true);
return method.invoke(objectClass, paramObjects);
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public Object getPrivateObject(String feildName)
{
return WebViewPlus.getPrivateObject(this, feildName);
}
public static Object getPrivateObject(Object objectClass, String feildName)
{
try
{
Field theFeild = objectClass.getClass().getSuperclass().getDeclaredField(feildName);
theFeild.setAccessible(true);
return theFeild.get(objectClass);
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public static void setPrivateObject(Object objectClass, String feildName, Object newValue)
{
try
{
Field theFeild = objectClass.getClass().getSuperclass().getDeclaredField(feildName);
theFeild.setAccessible(true);
theFeild.set(objectClass, newValue);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void setPrivateObject(String feildName, Object newValue)
{
WebViewPlus.setPrivateObject(this, feildName, newValue);
}
}