2013.10.12 14:32


[Android] 안드로이드 메모리 관리(OutOfMemory) 4편. WebView


드디어 ! 메모리 관리의 마지막 !! WebView와 MapView이다. 둘 다 현재로서는 완벽한 해결책은 없는 상황 ! ㅠㅠ 어처구니가 없구먼... 맵뷰는 특히 더 없어서 조심해서 쓰는게 최선(?)이고 ㅋㅋ 그나마 웹뷰를 관리하는 알려진 방법을 공개한다. 


1. WebView를 사용한 Activity에서 종료시 cache를 삭제해주자. 

WebView의 clearCache()가 있지만 .. 믿음직 스럽지 못하다. 내장메모리에 메가바이트 단위로 캐시가 쌓이고 .. 완전히 삭제가 되지 않는다. 하지만 ! 다음 코드를 활용하면 깨끗하게 없어지는 것을 알 수 있다.


@Override

public void onDestroy() {

super.onDestroy();

clearApplicationCache();


private void clearApplicationCache(){

File dir = getCacheDir();

      

if(dir==null)

           return;


      File[] children = dir.listFiles();

      try{

for(int i=0;i<children.length;i++)

                if(children[i].isDirectory())

                    clearApplicationCache(children[i]);

                else

  children[i].delete();

        }

        catch(Exception e){}

}



2. NonLeakingWebVew라는 것을 사용하자.

누가 처음 만들었는지 모르겠지만 널리 사용되는 WebView를 상속한 클래스다. 실제로 걍 WebView는 처음 초기화 하는데만 30kb정도의 메모리를 잡아먹는데 이놈을 사용하면 2kb까지 줄어든다고 한다.


public class NonLeakingWebView extends WebView {

    private static Field sConfigCallback;


    static {

        try {

            sConfigCallback = Class.forName("android.webkit.BrowserFrame").getDeclaredField("sConfigCallback");

            sConfigCallback.setAccessible(true);

        } catch (Exception e) {

            // ignored

        }


    }



    public NonLeakingWebView(Context context) {

        super(context.getApplicationContext());

        setWebViewClient( new MyWebViewClient((Activity)context) );

    }


    public NonLeakingWebView(Context context, AttributeSet attrs) {

        super(context.getApplicationContext(), attrs);

        setWebViewClient(new MyWebViewClient((Activity)context));

    }


    public NonLeakingWebView(Context context, AttributeSet attrs, int defStyle) {

        super(context.getApplicationContext(), attrs, defStyle);

        setWebViewClient(new MyWebViewClient((Activity)context));

    }


    @Override

    public void destroy() {

        super.destroy();


        try {

            if( sConfigCallback!=null )

                sConfigCallback.set(null, null);

        } catch (Exception e) {

            throw new RuntimeException(e);

        }

    }


    protected static class MyWebViewClient extends WebViewClient {

        protected WeakReference<Activity> activityRef;


        public MyWebViewClient( Activity activity ) {

            this.activityRef = new WeakReference<Activity>(activity);

        }


        @Override

        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            try {

                final Activity activity = activityRef.get();

                if( activity!=null )

                    activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));

            }catch( RuntimeException ignored ) {

                // ignore any url parsing exceptions

            }

            return true;

        }

    }

}



이것으로 일단은 !! 4편까지 해서 메모리 관리에대한 포스팅을 마치지만 ! 언젠가 또 무슨 메모리 이슈가 생기면 다시 돌아오겠음!




Posted by 초보코딩왕

댓글을 달아 주세요