跟踪网页在背景中

时间:2013-12-23 18:17:10

标签: java android google-analytics android-webview google-analytics-api

我想基于网络服务设计应用,我也希望通过WebView根据网络服务数据打开一些背景网页,以便能够跟踪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();
    }
}

提前致谢...

1 个答案:

答案 0 :(得分:1)

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