【问题标题】:Async Task, Webview, Cookies - Android异步任务、Webview、Cookies - Android
【发布时间】:2011-08-14 13:24:32
【问题描述】:

我有一个“本机”登录屏幕,它设置了一个静态 cookie,然后这个活动从 LoginWebView 获取 cookie。 我在异步任务中执行此操作。 现在的问题是异步任务包含 3 个非常丑陋的 hack,这使得代码非常不可靠(这些 hack 在下面的代码中标出)。

问题是,您知道如何摆脱这些丑陋的黑客行为中的一个或多个吗?

Hack nr 1 - 这取自某人在此处发布的关于堆栈溢出的示例,cookie 需要等待一段时间才能真正工作并加载到 webview 中,我不知道为什么但没有它它就无法工作。不过这还不是最大的问题。

Hack nr 2 - 我不知道为什么,但是如果我想能够加载另一个页面,我必须首先加载我从中获取 cookie 的页面。加载后,我只需稍等片刻,然后加载另一个 url。有谁知道为什么? 如果我不这样做,webview 会识别出 cookie 存在但根本不会完成加载任何页面,它只会卡在加载中并且永远不会完成。

Hack nr 3 - 这只是为了补救 hack nr 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();
        }
    }
}

【问题讨论】:

  • 你真的必须使用 AsyncTask 吗?你不能只使用你的线程吗?
  • 那是我第一次尝试,但还是同样的问题!

标签: android http cookies webview android-asynctask


【解决方案1】:

您能否尝试一下我在中提出的连接线程解决方案 android session management 登录活动可以利用它。 而对于 WebView,您可以通过 cookie 传递(sCookie 是登录活动已经设置的静态 cookie 字符串):

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多