我试图引用一个活跃的片段实例,但我不确定我这样做的方式是否最好,或者是否会导致内存泄漏。在JavaScript中,这样做将保留Object的实例并可能导致问题,但我不确定Java在GC中的行为方式。
以下有效,但有更好的方法吗?
public class WebframeFragment extends Fragment {
...
String baseUrl;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Fragment self = this; // will this cause trouble?
this.baseUrl = getActivity().getIntent().getStringExtra(Extra.REQUEST_URL);
webActivity.setWebView(webView);
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (urlType(url) == urlType(self.baseUrl)){
return false;
}
}
}
}
...
}
答案 0 :(得分:2)
我不确定它是否会导致内存泄漏。如果WebView是片段的一部分那么没有 - Java GC处理周期很好,否则 - 只有当WebView停留的时间超过片段时才会泄漏。
理想情况下,您需要将需要从WebViewClient和Fragment引用的状态移动到单独的类中,并让WebViewClient和Fragment引用该类的实例。
答案 1 :(得分:1)
它不会导致内存问题,因为您只创建一个不创建新对象的指针。
答案 2 :(得分:1)
然后这样做,
if (urlType(url) == urlType(self.baseUrl)){
self = null;
return false;
}
并且在获得baseUrl之后,你将释放自己的var。