22

以下のコードで Cookie を保存できましたが、アプリケーションを閉じるとすぐに Cookie が消えてしまいます。

これはどのように発生し、どうすれば解決できますか?

package com.jkjljkj

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class Activity extends Activity {

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        CookieSyncManager.createInstance(getBaseContext());

        // Let's display the progress in the activity title bar, like the
        // browser app does.


        getWindow().requestFeature(Window.FEATURE_PROGRESS);

        WebView webview = new WebView(this);
        setContentView(webview);


        webview.getSettings().setJavaScriptEnabled(true);

        final Activity activity = this;
        webview.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
             // Activities and WebViews measure progress with different scales.
             // The progress meter will automatically disappear when we reach 100%
             activity.setProgress(progress * 1000);
        }
      });

      webview.setWebViewClient(new WebViewClient() {

         public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
              //Users will be notified in case there's an error (i.e. no internet connection)
              Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
         }
      });

      CookieSyncManager.getInstance().startSync();
      CookieSyncManager.getInstance().sync();

     //This will load the webpage that we want to see
      webview.loadUrl("http://");

   }
}
4

4 に答える 4

44

問題のページを読み込んだ、CookieSyncManager に同期するように指示する必要があります。サンプル コードでは、がページをロードしようとするonCreate前にメソッドが完全に実行されるWebViewため、(非同期に発生する) 同期プロセスは、ページがロードされる前に完了する可能性があります。

代わりに、WebViewClient で onPageFinished を同期するように CookieSyncManager に指示します。それはあなたが望むものを手に入れるはずです。

これを適切に行う方法については、 CookieSyncManager のドキュメントを参照してください。

これを行うために WebViewClient 実装をセットアップする方法は次のとおりです。

webview.setWebViewClient(new WebViewClient() {
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        //Users will be notified in case there's an error (i.e. no internet connection)
        Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
    }

    public void onPageFinished(WebView view, String url) {
        CookieSyncManager.getInstance().sync();
    }
);

これを使用して、CookieSyncManager に他の場所で同期するように指示する必要はありません。私はこれをテストしていないので、うまくいくかどうか教えてください。

于 2011-12-05T18:49:29.483 に答える
5

.sync() は即時同期を強制するためのものであり、ページの読み込み後に呼び出されて RAM とキャッシュが同期されるため、呼び出す前に Cookie が RAM にある必要があります。

このスキームを使用すると、システムは5分ごとに自動的に同期します

onCreate: 
CookieSyncManager.createInstance(context)

onResume:
CookieSyncManager.getInstance().startSync()

onPause:
CookieSyncManager.getInstance().stopSync()

あなたは 5 分待たなかったと思うので、システムは Cookie を保存します。

于 2014-12-22T03:21:48.453 に答える