2011-04-28 4 views
0

J'ai un écran de connexion "natif" qui définit un cookie statique, puis cette activité obtient le cookie de LoginWebView. Je le fais dans une tâche asynchrone. Le problème est maintenant que la tâche asynchrone contient 3 hacks très laids ce qui rend le code très peu fiable (les hacks sont balisés dans le code ci-dessous).Tâche asynchrone, Webview, Cookies - Android

La question est, avez-vous une idée sur la façon de se débarrasser d'un ou plusieurs de ces vilains hacks?

Hack n ° 1- Il est récupéré à partir d'un exemple que quelqu'un a posté ici sur un débordement de pile, le cookie doit attendre un peu avant qu'il ne fonctionne réellement et charges dans le WebView, je ne sais pas pourquoi, mais sans elle ça ne marche tout simplement pas. Ce n'est pas le plus gros problème.

Hack n ° 2- Je ne sais pas pourquoi, mais si je veux être en mesure de charger une autre page, je dois d'abord charger la page que je suis le témoin de. Quand cela est chargé, j'attends simplement un petit peu et charge une autre URL. Est-ce que quelqu'un a une idée de pourquoi? Si je ne fais pas cela, le webview reconnaît que le cookie est là mais ne finira pas de charger les pages, il se bloque au chargement et ne finit jamais.

Hack n ° 3- Il est juste pour remédier à pirater n ° 2.

private class WebViewTask extends AsyncTask<Void, Void, Boolean> { 
    String cookieString1; 
    CookieManager cookieManager; 

    @Override 
    protected void onPreExecute() { 

     Cookie sessionCookie = LoginWebView.cookie1;   
     CookieSyncManager.createInstance(WebViewActivity.this); 
     cookieManager = CookieManager.getInstance(); 

     cookieString1 = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; " + 
     "domain=" + sessionCookie.getDomain(); 
     CookieSyncManager.getInstance(); 
        //cookieManager.removeSessionCookie(); 

     super.onPreExecute(); 
    } 
    protected Boolean doInBackground(Void... param) { 
     // HACK NR.1 
     SystemClock.sleep(600); 
     return false; 
    } 
    @Override 
    protected void onPostExecute(Boolean result) { 

     Log.v(TAG, "COOKIE SYNC 1: " + cookieString1); 
     Log.v(TAG, "COOKIE SYNC 1: " + domain); 
     cookieManager.setCookie(domain, cookieString1); 
     CookieSyncManager.getInstance().sync(); 


     WebSettings webSettings = webView.getSettings(); 
     webSettings.setSavePassword(true); 
     webSettings.setSaveFormData(true); 
     webSettings.setJavaScriptEnabled(true); 
     webSettings.setSupportZoom(false); 

     webView.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       Log.i(TAG, "Loading..."); 
       view.loadUrl(url); 
       return true; 
      } 
     }); 
        //HACK NR 2 
     webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR); 
     webView.loadUrl(domain); 
     Log.v(TAG, "PROGRESS " + webView.getProgress()); 
     button1.setChecked(true); 

     if(webView.getProgress() == 100) { 
        //HACK NR. 3 
      SystemClock.sleep(80); 
      webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); 
      clickButtonOne(); 
     } 
    } 
} 
+0

Avez-vous vraiment utiliser AsyncTask? Tu ne peux pas utiliser un de tes fils? – Yar

+0

C'était mon premier essai, mais c'est le même problème! –

Répondre

1

Pourriez-vous essayer peut-être une solution de fil rouge que je propose dans android session management Une activité de connexion pourrait utiliser cela. Et comme pour le WebView, vous pouvez passer le cookie avec (sCookie est la chaîne de cookie statique déjà défini par l'activité de connexion):

CookieSyncManager.createInstance(this); 
CookieManager cookieManager = CookieManager.getInstance(); 

String cookieString = sCookie+"; domain="+sDOMAIN; 
cookieManager.setCookie(sDOMAIN, cookieString); 
CookieSyncManager.getInstance().sync(); 
Questions connexes