![](/img/trans.png)
[英]How to prevent my app from crashing when there is no input or if input is invalid
[英]How can I resolve memory leaks and prevent my app from crashing using fragments?
我認為我在Android應用程序中使用片段時會發生內存泄漏,因為當我添加更多片段時,應用程序會崩潰,每個新片段都會打開內存峰值。 我該如何解決? 我對片段還很陌生,並且我已經使用了很多資源來適當地使用...。 隨着片段的不斷變化,堆不斷增長,導致內存泄漏。
這是我的MainActivity.java
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
public class MainActivity extends FragmentActivity {
ViewPager viewpager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewpager = (ViewPager) findViewById(R.id.pager);
PagerAdapter padapter = new PagerAdapter(getSupportFragmentManager());
viewpager.setAdapter(padapter);
}
}
這是我的PagerAdapter.java
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class PagerAdapter extends FragmentPagerAdapter {
public PagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
switch (arg0) {
case 0:
return new FragmentOne();
case 1:
return new FragmentTwo();
case 2:
return new FragmentThree();
case 3:
return new FragmentFour();
case 4:
return new FragmentFive();
default:
break;
}
return null;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 5;
}
}
給定上面的代碼,當我切換到片段4或5時,我保留為先前的片段分配的先前的內存,因此應用程序的內存級別不受控制地達到峰值,並且應用程序開始滯后。 片段5甚至沒有加載,所以我不知道那是因為沒有足夠的內存還是由於代碼錯誤。 請幫助,因為我迷路了。
在適配器中執行此操作。
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
Fragment fragment = null;
switch (arg0) {
case 0:
fragment = new FragmentOne();
case 1:
fragment = new FragmentTwo();
case 2:
fragment = new FragmentThree();
case 3:
fragment = new FragmentFour();
case 4:
fragment = new FragmentFive();
default:
break;
}
return fragment;
}
像Sjd提供的解決方案一樣,僅將局部片段變量聲明為null不會幫助內存優化。
如果您有很多碎片將占用大量內存,則應使用FragmentStatePagerAdapter ,這意味着一旦移至另一個碎片 ,一個碎片將被銷毀。 如果沒有那么多片段,則可以簡單地使用FragmentPagerAdapter來將片段保留在內存中。
因此,您的PagerAdapter.java實現必須進行如下修改:
public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 5;
}
@Override
public Fragment getItem(int position) {
switch (arg0) {
case 0:
return new FragmentOne();
case 1:
return new FragmentTwo();
case 2:
return new FragmentThree();
case 3:
return new FragmentFour();
case 4:
return new FragmentFive();
default:
break;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.