亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

android-studio - android webview 內(nèi)存泄漏

瀏覽:44日期:2024-03-01 16:09:05

問題描述

每次啟動這個activity memory allocated 逐漸增加,且不會被回收求解決方案,下面是具體實現(xiàn)

public class NetWork { private static AuthApi authApi; private static UserApi userApi; private static Converter.Factory gsonConverterFactory= GsonConverterFactory.create(); private static CallAdapter.Factory rxJavaCallAdapterFactory= RxJavaCallAdapterFactory.create(); public static AuthApi getAuthApi(){Log.d('NetWork', 'authApi==null:' + (authApi == null));if(authApi == null){ Retrofit retrofit=new Retrofit.Builder() .baseUrl(UrlConfig.ACCESS_TOKEN) .addCallAdapterFactory(rxJavaCallAdapterFactory) .addConverterFactory(gsonConverterFactory) .build(); authApi=retrofit.create(AuthApi.class);}return authApi; } public static UserApi getUserApi(){Log.d('NetWork', 'userApi==null:' + (userApi == null));if(userApi == null){ Retrofit retrofit=new Retrofit.Builder() .baseUrl(UrlConfig.BASE_URL) .addCallAdapterFactory(rxJavaCallAdapterFactory) .addConverterFactory(gsonConverterFactory) .build(); userApi=retrofit.create(UserApi.class);}return userApi; }}

public class OAuthLoginActivity extends AppCompatActivity { private WebViewProgress mWebView; Subscription mSubscription; Subscription mProgressSubscription; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_oauth);initView();/** 1.getCode client_id scope* 2.getToken client_id client_secret code* */mWebView.loadUrl(UrlConfig.LOGIN_URL);Log.d('webViewURL',mWebView.getUrl()); } @Override protected void onDestroy() {super.onDestroy();mWebView.removeAllViews();mWebView.destroy();if(mSubscription!=null){ mSubscription.unsubscribe();}if(mProgressSubscription!=null){ mProgressSubscription.unsubscribe();} } @Override public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()){ case android.R.id.home:finish();return true;}return super.onOptionsItemSelected(item); } class MyWebViewClient extends WebViewClient{@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); Log.d('MyWebViewClient', url); if(url.contains('?code=')){Uri uri=Uri.parse(url);String code=uri.getQueryParameter('code');getUser(code); }}@Overridepublic void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mProgressSubscription=Observable.timer(1, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Long>() {@Overridepublic void call(Long aLong) { mWebView.mProgressBar.setVisibility(View.GONE);} });} } private void initView(){Toolbar toolbar=(Toolbar) findViewById(R.id.toolbar);mWebView=(WebViewProgress) findViewById(R.id.web_view);toolbar.setTitle('授權(quán)登錄');setSupportActionBar(toolbar);getSupportActionBar().setDisplayHomeAsUpEnabled(true);WebSettings webSettings=mWebView.getSettings();webSettings.setJavaScriptEnabled(true);webSettings.setSupportZoom(true);webSettings.setBuiltInZoomControls(true);webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);mWebView.requestFocusFromTouch();mWebView.setWebViewClient(new MyWebViewClient()); } private void getUser(String code){mSubscription=NetWork.getAuthApi().getAccessToken(UrlConfig.CLIENT_ID,UrlConfig.CLIENT_SECRET,code).flatMap(new Func1<AccessToken, Observable<User>>() { @Override public Observable<User> call(AccessToken accessToken) {return NetWork.getUserApi().getUser(accessToken.getAccess_token()); }}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<User>() { @Override public void onCompleted() {Log.d('OAuthLoginActivity', 'completed'); } @Override public void onError(Throwable e) {Log.d('OAuthLoginActivity', 'e:' + e); } @Override public void onNext(User user) {Log.d('OK',user.getLogin());Toast.makeText(OAuthLoginActivity.this, user.getLogin(), Toast.LENGTH_SHORT).show(); }}); }}

問題解答

回答1:

補充:感謝@DOS提醒,增加LayoutParams布局參數(shù)設(shè)置。

你可以試試我的方法:

不要在布局文件中聲明<WebView>,改成在Activity中創(chuàng)建 如,WebView mWebView = new WebView(this);

在布局文件中用容器類布局,比如FrameLayout作為WebView的容器,在Activity中主動把WebView添加到容器中。

在OnDestory()中移除、銷毀WebView。

舉個例子吧:我們用FrameLayout作為WebView的父容器

1: 使用容器包裹WebView

<FrameLayout android: android:layout_width='fill_parent' android:layout_height='wrap_content'/>

2:在Activity中創(chuàng)建WebView,在OnDestroy()方法中從容器中移除、銷毀WebView

public class MyActivity extends Activity { private FrameLayout mContainer; private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); ... mContainer = (FrameLayout) findViewById(R.id.container);mWebView = new WebView(this);ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);mWebView.setLayoutParams(p);mContainer.addView(mWebView); } @Override protected void onDestroy() {super.onDestroy();mContainer.removeAllViews();mWebView.destroy(); }}

之所以這么做的原因是在XML文件中創(chuàng)建WebView,會把Activity作為Context傳給WebView,而不是Application Context。所以在finishingActivity的時候,WebView任然持有Activity引用,導致Activity無法被回收。更多詳情,戳這里

回答2:

樓主可以使用MAT分析一下,具體是哪個對象在持有Activity對象,然后在就可以定位到問題了。

回答3:

再加個:獨立進程

標簽: web
相關(guān)文章:
主站蜘蛛池模板: 奇米色88欧美一区二区 | 激情婷婷色 | 韩日视频在线观看 | 日本69sex护士www | 一级毛片无遮挡免费全部 | 免费影院在线 | 国产在线91| 久久亚洲国产成人精品性色 | 日本一级特黄毛片免费视频 | 婷婷天堂| 欧美一级aa天码毛片 | 性黄色片 | 国产高清视频在线免费观看 | 国产精品成人一区二区三区 | 中国黄色片网站 | 国产视频在线观看免费 | 国产三级精品播放 | 韩国一级特黄清高免费大片 | 国产亚洲欧美久久精品 | 久久久久爽亚洲精品 | julia一区二区三区中文字幕 | 国产区亚洲区 | 亚洲精品国产手机 | 国产三级黄色 | 男人的天堂222eee | 人人澡人人澡碰人人看软件 | 亚洲精品网址 | 日本福利视频一区 | 欧美精品一区二区三区视频 | 香蕉视频网站免费观视频 | 国产欧美日韩精品a在线观看 | 亚洲精品一区国产二区 | 久久久久婷婷国产综合青草 | 国产精品久久免费 | 国产精品爽爽影院在线 | 中国黄色大片 | 欧美爱爱动态 | 亚洲 欧美 激情 另类 校园 | 久久国产精品佐山爱 | 一级特级欧美aaaaa毛片 | 日本高清免费毛片久久看 |