2014-05-07 7 views
1

J'essaie de charger plusieurs pages l'une après l'autre, avec un intervalle de 30 secondes entre chaque chargement. C'est ma classe:Android WebView ne charge pas plusieurs pages

public class MainActivity extends Activity { 

    private WebView wv; 

    @SuppressLint("SetJavaScriptEnabled") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     wv = new WebView(this); 
     wv.setWebViewClient(new WebViewClient()); 
     wv.getSettings().setJavaScriptEnabled(true); 
     setContentView(wv); 
     String[] urlArr = {"http://www.google.com", "http://www.cnn.com", "http://www.wired.com"}; 
     int delay = 30 * 1000; 
     Handler handler = new Handler(); 
     for(int i = 0; i < urlArr.length; i++) { 
      MyRunnable runnable = new MyRunnable(urlArr[i]); 
      handler.postDelayed(runnable, delay); 
      delay = delay + 30 * 1000; 
     } 
    } 

    private class MyRunnable implements Runnable { 

     private String url; 

     public MyRunnable(String url) { 
      this.url = url; 
     } 

     public void run() { 
      wv.loadUrl(url); 
      Log.d("MainActivity", "PageLoaded: " + url); 
     } 
    } 

} 

Donc, la logique est assez simple: j'ai une seule instance WebView. Ensuite, à l'intérieur du cycle, j'appelle postDelayed(). Il ne charge que google.com, les deux autres ne sont pas chargés, même si le journal indique "PageLoaded". Y at-il une solution en utilisant le Handler?

+0

Juste vérifier votre URL de secound est appelée dans votre méthode d'exécution ou non ??? –

+2

Vous ne pouvez pas dire "PageLoaded" ici comme avec wv.loadUrl (url); vous avez seulement demandé au wv de charger cette page. Si vous voulez savoir quand la page est chargée, vous devez implémenter onPageFinished() de votre WebViewClient comme suit: wv.setWebViewClient (new WebViewClient() { public void onPageFinished (WebView webview, String url) { Log.d (" WebViewActivity "," onPageFinished() "+ url); Toast.makeText (WebViewActivity.this," onPageFinished() \ n "+ url, Toast.LENGTH_SHORT) .show(); WebViewActivity.this.setTitle (url); } } et d'utiliser le délai int = 0; pour commencer avec \t \t); – greenapps

+0

Je sais que "PageLoaded" n'est pas le bon moyen de journalisation, comme vous avez suggéré que la page est chargée uniquement lorsque onPageFinished est rappelé. C'était juste pour vérifier que la méthode run() dans MyRunnable a été appelée. – Angelo

Répondre

0

Ok, résolu. En fait, le code que j'ai posté fonctionne. Le problème vient lorsque les pages que je voulais charger vous demandent de quitter la page via un popup Javascript. Vous avez deux façons de gérer ce comportement:

  1. Instantiate WebChromeClient et de gérer la fenêtre
  2. Créer un seul cas WebView et les enregistrer dans la classe interne.

Ainsi, cette solution (le second) fonctionne aussi bien, même si plus de mémoire cher (peut-être?):

public class MainActivity extends Activity { 

    @SuppressLint("SetJavaScriptEnabled") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     String[] urlArr = {"http://www.google.com", "http://www.cnn.com", "http://www.wired.com"}; 
     int delay = 30 * 1000; 
     Handler handler = new Handler(); 
     for(int i = 0; i < urlArr.length; i++) { 
      WebView wv = new WebView(this); 
      wv.setWebViewClient(new WebViewClient()); 
      wv.getSettings().setJavaScriptEnabled(true); 
      MyRunnable runnable = new MyRunnable(urlArr[i], wv); 
      handler.postDelayed(runnable, delay); 
      delay = delay + 30 * 1000; 
     } 
    } 

    private class MyRunnable implements Runnable { 

     private String url; 
     private WebView wv; 

     public MyRunnable(String url, WebView wv) { 
      this.url = url; 
      this.wv = wv; 
     } 

     public void run() { 
      setContentView(wv); 
      wv.loadUrl(url); 
      Log.d("MainActivity", "PageLoaded: " + url); 
     } 
    } 
} 

Espérons que cela aide quelqu'un, merci quand même!

Questions connexes