我想设计一个基于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。