android webview内存泄露,android webview 内存泄漏

博客指出每次启动activity时内存分配逐渐增加且不回收的问题,寻求解决方案。给出了NetWork类和OAuthLoginActivity类的代码,涉及Retrofit网络请求和WebView使用,在onDestroy方法中对WebView等资源进行了释放操作,但仍存在内存泄露。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每次启动这个activity memory allocated 逐渐增加,且不会被回收

求解决方案,下面是具体实现

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{

@Override

public 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);

}

}

@Override

public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url);

mProgressSubscription=Observable.timer(1, TimeUnit.SECONDS)

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Action1() {

@Override

public 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("授权登录");

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>() {

@Override

public Observable call(AccessToken accessToken) {

return NetWork.getUserApi().getUser(accessToken.getAccess_token());

}

})

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@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();

}

});

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值