2017-01-28 20 views
0

ログインしたユーザーのURLからコンテンツを表示するためにwebviewを使用するアプリケーションを作成しています。これは非常に基本的で小さなアプリケーションです。私の問題は、ユーザーがログアウトし、他のユーザーがログインしていると、以前に読み込まれたコンテンツ(失効したコンテンツ)が表示されることです。WebView in android loading古いコンテンツ

import android.annotation.TargetApi; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.graphics.Bitmap; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v7.app.AlertDialog; 
import android.util.Log; 
import android.view.View; 
import android.webkit.WebResourceError; 
import android.webkit.WebResourceRequest; 
import android.webkit.WebResourceResponse; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.HashMap; 

import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 


public class WebViewActivity extends Activity { 
    boolean clearHistory; 
    private final String API_KEY = "apiKey"; 
    private final String TOKEN = "token"; 
    private WebView mWebView; 
    String TAG="Response"; 
    TextView topbar; 
    LinearLayout parentLayout; 
    HashMap<String, String> maps = new HashMap<>(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_webview); 
     mWebView =(WebView)findViewById(R.id.webview1); 
     mWebView.stopLoading(); 
     topbar=(TextView)findViewById(R.id.topbar); 
     parentLayout=(LinearLayout)findViewById(R.id.parentLayout); 

     SharedPreferences pref = getSharedPreferences("MyPref", 0); 
     final String webviewUrl = pref.getString("webviewUrl", ""); 
     final String token = pref.getString("app_token", ""); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 


     topbar.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       AlertDialog.Builder alertDialog = new AlertDialog.Builder(WebViewActivity.this); 
       alertDialog.setTitle("Confirm Logout"); 
       alertDialog.setMessage("Are you sure you want to logout?"); 
       alertDialog.setIcon(R.drawable.smlalo); 
       alertDialog.setPositiveButton("Logout", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog,int which) { 

         SharedPreferences pref = getSharedPreferences(
           "MyPref", 0); 
         SharedPreferences.Editor editor = pref.edit(); 
         editor.putString("webviewUrl", ""); 
         editor.putString("app_token", ""); 
         editor.commit(); 
         maps.put(TOKEN,token); 
         maps.put(API_KEY, BuildConfig.API_KEY_VALUE); 
         RestClient.getApiInterface().logout(maps).enqueue(new Callback<String>() { 
          @Override 
          public void onResponse(Call<String> call, Response<String> response) { 
           startActivity(new Intent(WebViewActivity.this, MainActivity.class)); 
           finish(); 
          } 

          @Override 
          public void onFailure(Call<String> call, Throwable t) { 

          } 
         }); 
        } 
       }); 

       // Setting Negative "NO" Button 
       alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 

       // Showing Alert Message 
       alertDialog.show(); 
      } 
     }); 

     final ProgressDialog progressDialog = ProgressDialog.show(WebViewActivity.this, "", "Loading..."); 

     mWebView.setWebViewClient(new WebViewClient() { 
      @Override 
      public void onLoadResource(WebView view, String url) { 
       view.clearHistory(); 
       super.onLoadResource(view,url); 
      } 
      @Override 
      public void onPageStarted(WebView view, String url, Bitmap favicon) 
      { 
       progressDialog.show(); 
       super.onPageStarted(view, url, favicon); 
      } 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       Log.i(TAG, "Processing webview url click..."); 
//    view.loadUrl(url); 
       super.shouldOverrideUrlLoading(view, url); 
       return false; 
      } 
      @TargetApi(Build.VERSION_CODES.M) 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
//    view.loadUrl(request.getUrl().toString()); 
       super.shouldOverrideUrlLoading(view, request); 
       return false; 
      } 
      public void onPageCommitVisible(WebView view, String url) { 
       view.clearHistory(); 
       view.clearCache(true); 
      } 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       Log.i(TAG, "Finished loading URL: " +url); 
       topbar.setVisibility(View.VISIBLE); 
       if (progressDialog.isShowing()) { 
        progressDialog.dismiss(); 
       } 
       /*if (clearHistory) 
       { 
        clearHistory = false; 
        mWebView.clearHistory(); 
        mWebView.clearCache(true); 
        if (progressDialog.isShowing()) { 
         progressDialog.dismiss(); 
        } 
       }*/ 
       super.onPageFinished(view, url); 
      } 
      @Override 
      public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
       Log.e(TAG, "Error: " + description); 
       new android.app.AlertDialog.Builder(WebViewActivity.this) 
         .setTitle("Error") 
         .setMessage(description) 
         .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
           // continue with delete 
          } 
         }) 
         .setIcon(android.R.drawable.ic_dialog_alert) 
         .show(); 
       if (progressDialog.isShowing()) { 
        progressDialog.dismiss(); 
       } 
       super.onReceivedError(view,errorCode,description,failingUrl); 
      } 
      @TargetApi(Build.VERSION_CODES.M) 
      @Override 
      public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { 
       new android.app.AlertDialog.Builder(WebViewActivity.this) 
         .setTitle("Error") 
         .setMessage(error.getDescription()) 
         .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
           // continue with delete 
          } 
         }) 
         .setIcon(android.R.drawable.ic_dialog_alert) 
         .show(); 
       super.onReceivedError(view, request, error); 
      } 
      @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
      @Override 
      public void onReceivedHttpError(WebView view, 
              WebResourceRequest request, WebResourceResponse errorResponse) { 

       Toast.makeText(WebViewActivity.this, "WebView Error" + errorResponse.getReasonPhrase(), Toast.LENGTH_SHORT).show(); 

       super.onReceivedHttpError(view, request, errorResponse); 
      } 

     }); 
     /*mWebView.loadUrl("about:blank"); 
     mWebView.reload();*/ 
     mWebView.loadUrl(webviewUrl); 
//  clearHistory = true; 
//  mWebView.reload(); 
    } 

} 

を、ここでレイアウトファイルです:ここではJavaクラスです

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:id="@+id/parentLayout" 
    android:layout_height="fill_parent" 
    tools:context=".SplashActivity"> 

    <RelativeLayout 
     android:background="@color/colorPrimary" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight=".2" 
     android:padding="10dp" 
     android:id="@+id/topbarbbb"> 

    <ImageView 
     android:text="@string/coachapp" 
     android:layout_width="wrap_content" 
     android:layout_centerVertical="true" 
     android:src="@drawable/smlalo" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerInParent="true" 
     android:id="@+id/imageView2" /> 
    <TextView 
     android:text="Logout" 
     android:textSize="12sp" 
     android:layout_height="wrap_content" 
     android:textColor="#ffffff" 
     android:visibility="gone" 
     style="@style/Base.TextAppearance.AppCompat.Button" 
     android:id="@+id/topbar" 
     android:layout_width="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_centerInParent="true"> 

    </TextView> 

</RelativeLayout> 

    <WebView android:id="@+id/webview1" 
     android:layout_below="@+id/topbarbbb" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" /> 
</LinearLayout> 

また言及することは、私はデバッグし、このために研究しています。 sharedpreferencesは問題ではなく、取得しているURLは表示したいURLです。ブラウザで正しく開きます。前のすべての回答をClear previously loaded Webview's content before loading the next oneclear webview historyとこの1つを試してみてください:Destroying the WebViewこれらのどれも私のために働かない。
本当にありがとうございました。

+2

[質問の削除と再投稿](http://stackoverflow.com/questions/41907714/webview-in-android-loading-stale-content)はしないでください。あなたが持っている新しい情報で元の投稿を編集するだけで、それをアクティブキューの一番上にバンプします。 –

+0

私はそれを理解しますが、私は持ってはいけないものを含めました。誰もがそれを見ることができた可能性があったため、編集も機能しません。だから私は訂正して再投稿しなければならなかった。 – ashishbahl

答えて

0

この問題は、あなたのWebビューに保存されたjavascriptのクッキーに発生する可能性があります。ウェブビューを開く前にクッキーをリフレッシュしてください。

0

私はそれを理解しました。ウェブビューでjavascriptを使用しているため、Cookieの作成につながった。ログアウトに成功した後、クッキーをクリアするコードを追加するだけでした。ここで私が使用したものです:

@SuppressWarnings("deprecation") 
public static void clearCookies(Context context) 
{ 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { 
     Log.d(C.TAG, "Using clearCookies code for API >=" + String.valueOf(Build.VERSION_CODES.LOLLIPOP_MR1)); 
     CookieManager.getInstance().removeAllCookies(null); 
     CookieManager.getInstance().flush(); 
    } else 
    { 
     Log.d(C.TAG, "Using clearCookies code for API <" + String.valueOf(Build.VERSION_CODES.LOLLIPOP_MR1)); 
     CookieSyncManager cookieSyncMngr=CookieSyncManager.createInstance(context); 
     cookieSyncMngr.startSync(); 
     CookieManager cookieManager=CookieManager.getInstance(); 
     cookieManager.removeAllCookie(); 
     cookieManager.removeSessionCookie(); 
     cookieSyncMngr.stopSync(); 
     cookieSyncMngr.sync(); 
    } 
} 

完全な答えがここで見つけることができます:clear cookies webview