2011-10-14 17 views
16

Estoy trabajando con phonegap y Android y tengo mis archivos .html y js en un servidor externo. Cuando utilizo el siguiente código, la aplicación carga los archivos .html externos y todo funciona bien:set loadURLTImeOutValue en webview

this.setIntegerProperty("loadUrlTimeoutValue", 60000); 
this.loadUrl("http://www.myserver.com"); 

Sin embargo, cuando el trabajo a través de una vista web no puede parecer que para establecer el loadURLTimeoutValue para una vista web:

private WebView webView; 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    try { 
     webView = (WebView) findViewById(R.id.webview);  
     webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
     webView.loadUrl("http://www.myserver.com");  
    } 

Esto no funciona. ¿Cómo puedo configurar el valor de tiempo de espera en la vista web?

Respuesta

26

Esto es una solución para simular el comportamiento descrito. Puede utilizar un WebViewClient, y anular el método onPageStarted:

public class MyWebViewClient extends WebViewClient { 
    boolean timeout; 

    public MyWebViewClient() { 
     timeout = true; 
    } 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       if(timeout) { 
        // do what you want 
       } 
      } 
     }).start(); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     timeout = false; 
    } 
} 

Si el tiempo de espera, puede cargar, por ejemplo, una página de error ...

Para añadir el WebViewClient a que WebView, simplemente hacer esto :

webView.setWebViewClient(new MyWebViewClient()); 
+0

esto no es posible si la página se ha cargado la mitad ... – mohitum

+0

Si hay un tiempo de espera, se podría intentar agregar algunos controles dentro de la declaración 'if' para verificar si la página se ha cargado la mitad –

+0

No se un problema si una página se carga correctamente y si carga otra página cuando el hilo no ha terminado de ejecutarse ... ¡Además, su constructor es incorrecto y debe establecer el tiempo de espera en verdadero en el método 'onPageStarted'! – andreas

12

que utiliza esto para establecer un tiempo de espera para mi WebView:

public class MyWebViewClient extends WebViewClient { 

    boolean timeout = true; 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     Runnable run = new Runnable() { 
      public void run() { 
       if(timeout) { 
        // do what you want 
        showAlert("Connection Timed out", "Whoops! Something went wrong. Please try again later."); 
       } 
      } 
     }; 
     Handler myHandler = new Handler(Looper.myLooper()); 
     myHandler.postDelayed(run, 5000); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     timeout = false; 
    } 
} 
+0

¿a qué se refiere "myHandler" aquí? intenté la solución antes que la tuya, pero el código que quería ejecutar provocó una excepción diciendo que necesito ejecutar mi código en el hilo de la interfaz de usuario. Su solución usa el método "postDelayed", que en teoría debería ejecutar el código en el hilo de UI, ¿verdad? Estoy confundido en cuanto a lo que es el "myHandler" frente a la "postDelayed"? podría cargar el ejemplo con el código myHandler, o un simple ejemplo de cómo definiría el código myhandler. – user280109

+0

myHandler se inicializa presumiblemente como nuevo controlador() en el hilo principal (UI). Mira la documentación de Android en Handler y Looper para más información.No está claro en la documentación si se llamará a OnPageFinished() en cualquier circunstancia, p. si se produce un error o se realiza una llamada a WebView.stopLoading(). – MZB

+0

myHandler = new Handler (Looper.myLooper()); – Rodrigo

2

Si extiende CordovaWebView, que debe con el fin de obtener la API PhoneGap, sólo puede utilizar el siguiente:

this.getIntent().putExtra("loadUrlTimeoutValue", 60000); 

Internamente, CordovaWebView implementa un mecanismo de tiempo de espera similares a los propuestos en el post anterior (por defecto tiempo de espera = 2000).

Tenga en cuenta que esta no es una interfaz documentada, por lo que podría romperse en el futuro.

6

La forma correcta de cambiar el valor predeterminado de tiempo de espera está utilizando la etiqueta <preference /> en el archivo config.xml, por ejemplo:

<preference name="loglevel" value="DEBUG" /> 
<preference name="loadUrlTimeoutValue" value="60000" /> 
<preference name="errorUrl" value="file:///android_asset/www/connection_error.html" /> 

Para más opciones de preferencia, se refieren a Android Configuration.

0
WebView mWebView = findViewById(R.id.web_view); 
mWebView.setWebViewClient(new WebViewClient() { 
    private final Handler handler = new Handler(); 
    private volatile boolean timeout; 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     super.onPageStarted(view, url, favicon); 

     timeout = true; 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       if(timeout) { 
        handler.post(new Runnable() { 
         @Override 
         public void run() { 
          // do what you want with UI           
         } 
        }); 
       } 
      } 
     }).start(); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 

     timeout = false; 
    } 
});