Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

is there any way to make a webview running android 4.0 perform at an acceptable level?

On both the emulator and on my galaxy nexus device, this simple demo app takes an entire 1000 milliseconds or longer to select or deselect a checkbox. I wanted to write the majority of my app in javascript so I could reuse the code across ios / android / web, but this is a deal breaker.

Here is my code:

(The Activity)

package com.mycompanyname;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.webkit.ConsoleMessage;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebSettings.RenderPriority;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.mycompanyname.R;

public class JavascriptListViewTestActivity extends Activity {
    private JavascriptListViewTestActivity parent = this;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);            

        WebChromeClient chrome = new WebChromeClient() {
            @Override
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                parent.showDialog(consoleMessage.message() + "\n" + consoleMessage.lineNumber());
                return true;
            }
        };

        WebViewClient client = new WebViewClient() {

        };

        WebView webView = (WebView)findViewById(R.id.webView1);
        webView.setWebChromeClient(chrome);
        webView.setWebViewClient(client);

        webView.getSettings().setJavaScriptEnabled(false);
        webView.getSettings().setAllowFileAccess(false);
        webView.getSettings().setAppCacheEnabled(false);
        webView.getSettings().setBuiltInZoomControls(false);
        webView.getSettings().setDatabaseEnabled(false);
        webView.getSettings().setDomStorageEnabled(false);
        webView.getSettings().setGeolocationEnabled(false);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
        webView.getSettings().setLightTouchEnabled(false);
        webView.getSettings().setLoadWithOverviewMode(false);
        webView.getSettings().setNavDump(false);
        webView.getSettings().setNeedInitialFocus(false);
        webView.getSettings().setPluginsEnabled(false);
        webView.getSettings().setRenderPriority(RenderPriority.HIGH);
        webView.getSettings().setSaveFormData(false);
        webView.getSettings().setSavePassword(false);
        webView.getSettings().setSupportMultipleWindows(false);
        webView.getSettings().setSupportZoom(false);
        webView.getSettings().setUseDoubleTree(false);
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

        String html = readText(R.raw.listview);

        webView.loadData(html, "text/html", "UTF-8");

    }

    private void showDialog(String message)
    {
        AlertDialog alert = new AlertDialog.Builder(parent).create();
        alert.setMessage(message);
        alert.show();
    }

    private String readText(int resourceId) 
    {
        InputStream is = this.getResources().openRawResource(resourceId);
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String readLine = null;
        StringBuffer outputBuffer = new StringBuffer();

        try 
        {
            while ((readLine = br.readLine()) != null) 
            {
                outputBuffer.append(readLine);
            }
            return outputBuffer.toString();
        } 
        catch (Exception e) {
            e.printStackTrace();
            return "";
        }
        finally 
        {
            // TODO: might throw - use IOUtils.close()
            try 
            {
                is.close();
                br.close();
            } 
            catch (IOException ex) 
            {
                showDialog(ex.toString());
            }
        }
    }
}

(The xml layout)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

(The html loaded in the webview)

<html>
<body>

<input type="checkbox" />

</body>
</html>
like image 255
davidjnelson Avatar asked Mar 28 '12 08:03

davidjnelson


1 Answers

I realize this is over a year old, but you could try implementing fastclick.js: https://github.com/ftlabs/fastclick

I've used it successfully on quite a few projects. As the page explains:

...mobile browsers will wait approximately 300ms from the time that you tap the button to fire the click event. The reason for this is that the browser is waiting to see if you are actually performing a double tap.

Same goes for interactions within a webview (as far as I know).

like image 59
Paul McClean Avatar answered Nov 10 '22 04:11

Paul McClean