在了解了内部类之后,我理解它有一个对外部类的隐式引用.
但我的老师告诉我,最好的方法是不使用内部类,更喜欢使用静态内部类.因为内部类可能会泄漏内存.
有人可以解释一下吗?
我有一个Activity,它本身就有三个Fragment.
在其中一个片段中,有一个RecyclerView带有自定义适配器,并且单击其中一个项目将转到另一个页面,这是相同的新实例Activity.但是,某种行为会导致我的应用程序出错.
在我的Activity中,单击其中一个项会显示同一个Activity的新实例,这很好.然后我按下后退按钮,我被带回第一个活动.但是再次单击其中一个项目(以启动相同Activity的新实例)会导致以下错误:
java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.String android.content.Context.getPackageName()'
同样重要的是要考虑我在我的Activity中的一个片段中调用Activity的新实例(即三个项目的位置).所以,当我打电话给它时,我有类似的东西:
public class MyActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
ViewPager viewPager = (ViewPager) findViewById(R.id.detail_viewpager);
viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
TabLayout tabLayout = (TabLayout) findViewById(R.id.detail_tabs);
tabLayout.setTabTextColors(
ContextCompat.getColor(this, R.color.text_white_secondary),
ContextCompat.getColor(this, R.color.text_white));
tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(this, R.color.white));
tabLayout.setupWithViewPager(viewPager);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
}
...
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 3;
}
@Override
public Fragment getItem(int position) {
switch …Run Code Online (Sandbox Code Playgroud) android nullpointerexception android-context android-fragments
我正在阅读高效的 Android 线程,其中说
最好使用静态内部类,而不是使用带有外部类引用的嵌套类,因为它们仅引用全局类对象而不引用实例对象。这只是减轻了泄漏,因为在线程执行时,静态内部类对其他实例对象的所有显式引用仍然有效。
但我不清楚为什么它会减轻泄漏。如果静态内部类对其他实例对象的所有显式引用都处于活动状态,那么这不是与上述解释相反的内存泄漏原因吗?
有没有办法同时使用键和值创建映射(我的意思是一行代码)?例如,我创建了一个名为 map 的映射,每当我想添加一对新的键/值时,我都需要使用“put”方法。当我们创建地图时,是否有更短的方法来填充地图?
Map<String, String> map = new HashMap<String, String>();
map.put("A", "32");
map.put("C", "34");
map.put("T", "53");
Run Code Online (Sandbox Code Playgroud)