我想基于网络服务设计应用,我也希望通过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();
}
}
提前致谢...
答案 0 :(得分:1)
在与OP讨论之后,似乎在这种情况下本身没有内存泄漏;相反,WebView是一个内存密集型组件,在使用时会消耗相对较多的RAM。