2017-09-09 1 views
1

Je me demande s'il y a plusieurs instances de webview en cours de création dans mon application Android. Si oui, comment le résoudre?Android Webview - Crée-t-il plusieurs instances?

La raison de ma confusion est que cela se voit dans mes outils de développement Chrome. Chrome Dev Tools Screenshot

Chaque fois que j'appelle loadURL, un nouvel élément de campagne apparaît sur Chrome comme si une nouvelle instance de WebView était créée. et voici mon code

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);   

    WebView myWebView = (WebView) findViewById(R.id.webview); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) 
     { WebView.setWebContentsDebuggingEnabled(true); } 
    } 
    myWebView.setWebViewClient(new WebViewClient(){ 
     public void onPageFinished(WebView view, String url) { 
      // Page is done loading; 
      _appRunning = true; 
     } 
    }); 
    myWebView.addJavascriptInterface(new WebAppInterface(this), "Android"); 

    myWebView.getSettings().setMediaPlaybackRequiresUserGesture(false); 
    myWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); 

    final WebSettings webSettings = myWebView.getSettings(); 

    webSettings.setJavaScriptEnabled(true); 
    webSettings.setDomStorageEnabled(true); 
    webSettings.setAppCachePath(f.getAbsolutePath()); 
    webSettings.setAllowFileAccess(true); 
    webSettings.setAppCacheEnabled(true); 

    } 
    @Override 
    public void onResume(){ 
     super.onResume(); 
     if(!checkConnectivity()) return; 
     _appRunning = true; 
     WebView myWebView = (WebView) findViewById(R.id.webview); 
     String url = getString(R.string.app_url); 

     myWebView.loadUrl(url); 
     myWebView.onResume(); 
     hideSystemUI(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); // Always call the superclass method first 
     stopPlayer(); 
     //myWebView.onPause();    
    } 

    @Override 
    public void onStop() { 
     stopPlayer(); 
     super.onStop(); 
    } 

    private void stopPlayer(){ 
     WebView myWebView = (WebView) findViewById(R.id.webview); 
     myWebView.loadUrl("about:blank"); 
     showSystemUI(); 
     _appRunning = false; 
    } 
+0

Il existe des cas où la méthode onResume() est appelée plusieurs fois, ce qui peut provoquer le problème. Je suggère de mettre cette ligne WebView myWebView = (WebView) findViewById (R.id.webview); Chaîne url = getString (R.string.app_url); dans la méthode onCreate() de votre code – Ikun

+0

Je l'ai dans onCreate() aussi. Le comportement que je vois est lorsque l'utilisateur appuie sur le bouton d'accueil et lance à nouveau l'application. Chaque fois que l'application est lancée, elle apparaît à peu près comme une nouvelle ligne sur les outils de développement Chrome. – Bhuvan

+0

Il semble que chaque fois que l'application est appelée avec une intention, elle crée une nouvelle instance de l'activité. L'appel de la méthode finish() dans les méthodes onStop() et onResume() a résolu ce problème. J'essaie toujours de trouver une meilleure solution, car je veux vraiment garder et réutiliser l'instance de l'activité pour effectuer certaines opérations en arrière-plan, alors que l'application est dans l'arrière-plan. – Bhuvan

Répondre

1

Ne pas redéclarer WebView dans votre stopPlayer() et onResume(). Utilisez la même instance que vous avez créée dans onCreate(). Vous pouvez définir ce WebView en tant que champ et l'initialiser dans onCreate() et l'utiliser partout.

WebView myWebView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main);   

myWebView = (WebView) findViewById(R.id.webview); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) 
    { WebView.setWebContentsDebuggingEnabled(true); } 
} 
myWebView.setWebViewClient(new WebViewClient(){ 
    public void onPageFinished(WebView view, String url) { 
     // Page is done loading; 
     _appRunning = true; 
    } 
}); 
myWebView.addJavascriptInterface(new WebAppInterface(this), "Android"); 

myWebView.getSettings().setMediaPlaybackRequiresUserGesture(false); 
myWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); 

final WebSettings webSettings = myWebView.getSettings(); 

webSettings.setJavaScriptEnabled(true); 
webSettings.setDomStorageEnabled(true); 
webSettings.setAppCachePath(f.getAbsolutePath()); 
webSettings.setAllowFileAccess(true); 
webSettings.setAppCacheEnabled(true); 

} 
@Override 
public void onResume(){ 
    super.onResume(); 
    if(!checkConnectivity()) return; 
    _appRunning = true; 
    String url = getString(R.string.app_url); 

    myWebView.loadUrl(url); 
    myWebView.onResume(); 
    hideSystemUI(); 
} 

@Override 
public void onPause() { 
    super.onPause(); // Always call the superclass method first 
    stopPlayer(); 
    //myWebView.onPause();    
} 

@Override 
public void onStop() { 
    stopPlayer(); 
    super.onStop(); 
} 

private void stopPlayer(){ 

    myWebView.loadUrl("about:blank"); 
    showSystemUI(); 
    _appRunning = false; 
} 
+0

Merci @Shriyansh. J'ai essayé ça ... n'a pas fait de différence. – Bhuvan