2012-03-28 17 views
7

Sia sull'emulatore che sul mio dispositivo galaxy nexus, questa semplice applicazione demo impiega un tempo intero di 1000 millisecondi o più per selezionare o deselezionare una casella di controllo. Volevo scrivere la maggior parte della mia app in javascript in modo da poter riutilizzare il codice su ios/android/web, ma questo è un problema.c'è un modo per fare una webview con Android 4.0 funzionare a un livello accettabile?

Ecco il mio codice:

(l'attività)

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()); 
      } 
     } 
    } 
} 

(Il layout xml)

<?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> 

(il codice HTML caricato nella WebView)

<html> 
<body> 

<input type="checkbox" /> 

</body> 
</html> 
+0

Ho notato che ottengo le stesse terribili prestazioni in un normale browser Web utilizzando il browser standard o il chrome per Android. andare su gmail.com e selezionare o deselezionare la casella di controllo quando si è disconnessi per passare da "ricordami" richiede ancora un secondo! questo è folle... – davidjnelson

risposta

2

Mi rendo conto che questo è finito per voi ar vecchio, ma potresti provare a implementare fastclick.js: https://github.com/ftlabs/fastclick

L'ho usato con successo su parecchi progetti. Come spiega la pagina:

... i browser mobili attenderanno circa 300ms dal momento in cui si tocca il pulsante per attivare l'evento click. La ragione di ciò è che il browser è in attesa di vedere se stai effettivamente eseguendo un doppio tocco .

Lo stesso vale per le interazioni all'interno di una visualizzazione Web (per quanto ne so).

Problemi correlati