2012-03-28 6 views
7

Sowohl auf dem Emulator als auch auf meinem Galaxy Nexus-Gerät benötigt diese einfache Demo-App ganze 1000 Millisekunden oder länger, um ein Kontrollkästchen zu aktivieren oder zu deaktivieren. Ich wollte die Mehrheit meiner App in Javascript schreiben, damit ich den Code über ios/android/web wiederverwenden kann, aber das ist ein Deal Breaker.gibt es eine möglichkeit, ein webview laufendes android 4.0 auf einem akzeptablen niveau zu machen?

Hier ist mein Code:

(Die Aktivität)

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

(Die 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> 

(die HTML im webview geladen)

<html> 
<body> 

<input type="checkbox" /> 

</body> 
</html> 
+0

Ich bemerkte, dass ich die gleiche schreckliche Leistung in einem normalen Webbrowser mit dem Standard-Browser oder Chrome für Android bekomme. going to gmail.com, und die Auswahl oder das Abwählen des Kontrollkästchens, wenn ausgeloggt, um "Remember me" umzuschalten, dauert noch eine ganze Sekunde! das ist verrückt... – davidjnelson

Antwort

2

Ich weiß, dass dies über ein Jahr ist alt, aber Sie könnten versuchen, fastclick.js zu implementieren: https://github.com/ftlabs/fastclick

Ich habe es erfolgreich bei einigen Projekten verwendet. Wie die Seite erklärt:

... mobile Browser wird ca. 300ms ab dem Zeitpunkt warten, tippen Sie auf die Schaltfläche, um das Klickereignis auszulösen. Der Grund dafür ist , dass der Browser wartet, um zu sehen, ob Sie tatsächlich eine Doppeltipp durchführen.

Das gleiche gilt für Interaktionen in einem Webview (soweit ich weiß).

Verwandte Themen