2017-01-28 1 views
0

로그인 한 사용자의 URL에서 콘텐츠를 표시하는 webview를 사용하는 응용 프로그램을 만들고 있습니다. 매우 기본적이고 작은 응용 프로그램입니다. 내 문제는 사용자가 로그 아웃하고 다른 사용자가 로그인하면 이전에로드 된 콘텐츠 (부실 콘텐츠)가 표시된다는 것입니다.안드로이드 WebView in stale 콘텐츠

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(); 
    } 

} 

을 여기 레이아웃 파일이다 : 다음은 자바 클래스의

<?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 one, clear webview history 및이 중 하나 : Destroying the WebView. 이것들 중 어느 것도 나를 위해 일하지 않는다.
정말 도움이됩니다.

+2

[삭제하고 재 게시하십시오] (http://stackoverflow.com/questions/41907714/webview-in-android-loading-stale-content)하지 마십시오. 새 정보로 원래 게시물을 편집하면 활성 대기열의 맨 위에 올립니다. –

+0

나는 그것을 이해하지만, 내가 갖고 있으면 안되는 것을 포함했다. 누구나 볼 수있는 기회가 있었기 때문에 편집도 작동하지 않습니다. 그래서 나는 수정하고 다시 게시해야했습니다. – ashishbahl

답변

0

이 문제로 인해 웹보기에 저장된 자바 스크립트 쿠키 발생할 수 있습니다. 웹보기를 열기 전에 쿠키를 새로 고침하십시오.

0

나는 그것을 알아 냈다. 웹 뷰에서 자바 스크립트를 사용하기 때문에 쿠키가 생성되었습니다. 성공적인 로그 아웃 후에 쿠키를 삭제하기위한 코드를 추가해야했습니다. 여기 내가 사용하는 작업은 다음과 같습니다

@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