在后台跟踪网页



我想设计一个基于Web服务的应用程序,我还想通过WebView根据Web服务数据打开一些背景页面,以便能够在GoogleAnalytics中跟踪该页面。

为了实现这个想法,我写了以下单例,它的工作符合我的预期,但这段代码中存在奇怪的内存泄漏行为,我认为它导致了WebView错误!

public class SiteLoader {
    private static SiteLoader mSiteLoader;
    private WebView mWebView;
    private Context c;
    public enum LoaderUri {
        MUSIC_URI, VIDEO_URI, BOOK_URI
    }
    private SiteLoader(Context c) {
        this.c = c.getApplicationContext();
    }
    public static SiteLoader getInstance(Context c) {
        if (mSiteLoader == null)
            mSiteLoader = new SiteLoader(c);
        return mSiteLoader;
    }
    public void trackUri(LoaderUri uri, String extraData) {
        // Load new progress
        switch (uri) {
            case MUSIC_URI:
                getWebView().loadUrl(Constants.HOST_PREFIX + "/music/?id=" + extraData);
                break;
            case VIDEO_URI:
                getWebView().loadUrl(Constants.HOST_PREFIX + "/video/?id=" + extraData);
                break;
            case BOOK_URI:
                getWebView().loadUrl(Constants.HOST_PREFIX + "/book/?id=" + extraData);
                break;
        }
    }
    public void destroyTracker() {
        if (mWebView != null) {
             mWebView.destroy();
             mWebView = null;
        }
    }
    private WebView getWebView() {
        if (mWebView == null) {
            mWebView = new WebView(c);
            mWebView.getSettings().setJavaScriptEnabled(true);
        }
        return mWebView;
    }
}

关于如何摆脱这种情况的任何想法,或者是否有任何其他替代方法可以直接在web-service中固定页面?

测试用例活动:

public class TestActivity extends Activity {
    @Override 
    public void onResume() {
        super.onResume();
        SiteLoader.getInstance(this).trackUri(LoaderUri.VIDEO_URI, "en");
    }
    @Override 
    public void onPause() {
        super.onResume();
        SiteLoader.getInstance(this).destroyTracker();
    }
    @Override
    public void onCreate(Bundle mBundle) {
        super.onCreate(mBundle);
        Toast.makeText(this, "System is running", Toast.LENGTH_LONG).show();
    }
}

提前致谢...

在与OP讨论后,在这种情况下似乎没有内存泄漏本身;相反,WebView是一个内存密集型组件,在使用时会消耗相对大量的RAM。

最新更新