求安卓大手子救救孩子吧,这个app项目闪退问题怎么解决?

附上两个Activiy的部分代码

public class MainActivity extends BaseActivity implements TabLayout.OnTabSelectedListener, IMutualListener {

    private ViewPager mViewPager ;
    private TabLayout mTabLayout ;
    private View tabView = null;
    private List<String> mTabList = new ArrayList<>();
    private MainFragmentAdapter mFragmentAdapter;
    private List<Fragment> mFragments = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager = findViewById(R.id.home_ViewPager);
        mTabLayout = findViewById(R.id.tab_layout);

    }

    private int[] tabIcons = {
            R.mipmap.selector_home_normal,
            R.mipmap.selector_alarm_normal,
            R.mipmap.selector_mine_normal,
            R.mipmap.selector_more_normal,
    };
    private int[] tabIconsPressed = {
            R.mipmap.selector_home_pressed,
            R.mipmap.selector_alarm_pressed,
            R.mipmap.selector_mine_pressed,
            R.mipmap.selector_more_pressed,
    };

    @Override
    public int getContentViewId(){
        return R.layout.activity_main;
    }

    @Override
    public void initViews() {
        receiveAdDownload();
        initFragmentList();
        initFragments();
        initLabeView();
    }

    private void initLabeView() {
        initBadgeViews();
    }

    private void initBadgeViews() {

    }

    private void initTabList(){
        mTabList.clear();
        mTabList.add(MyApplication.getAppResources().getString(R.string.home));
        mTabList.add(MyApplication.getAppResources().getString(R.string.alarm));
        mTabList.add(MyApplication.getAppResources().getString(R.string.mine));
        mTabList.add(MyApplication.getAppResources().getString(R.string.more));
    }

    private void initFragmentList(){
        mFragments.clear();
        mFragments.add(HomeFragment.getInstance(MyApplication.getAppResources().getString(R.string.home)));
        mFragments.add(AlarmFragment.getInstance(MyApplication.getAppResources().getString(R.string.alarm)));
        mFragments.add(MineFragment.getInstance(MyApplication.getAppResources().getString(R.string.mine)));
        mFragments.add(MineFragment.getInstance(MyApplication.getAppResources().getString(R.string.more)));
    }

    private void initFragments() {
        initTabList();
        mFragmentAdapter = new MainFragmentAdapter(getSupportFragmentManager(), mTabList, getApplicationContext(), mFragments);
        mViewPager.setAdapter(mFragmentAdapter);
        mViewPager.setCurrentItem(0);
        mTabLayout.setupWithViewPager(mViewPager);
        mTabLayout.setTabMode(TabLayout.MODE_FIXED);
        mTabLayout.addOnTabSelectedListener(this);

        mTabLayout.getTabAt(0).setCustomView(getTabView(0));
        mTabLayout.getTabAt(1).setCustomView(getTabView(1));
        mTabLayout.getTabAt(2).setCustomView(getTabView(2));
        mTabLayout.getTabAt(3).setCustomView(getTabView(3));
    }

 

public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements UIInitA {

    protected P mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (null != onCreatePresenter()){
            mPresenter =onCreatePresenter();
        }
        AppManager.newInstance().addActivivty(this);
        setContentView(getContentViewId());
        initViews();
        addListener();
        initData();
    }

 

代码调用顺序问题,导致指针的,因为initViews() 方法先走,initViews 走之前mViewPager = findViewById(R.id.home_ViewPager);这行代码还没执行,这就导致mViewPager还没初始化,你使用他就空指针了。

分析:

你不应该在子类调用onCreate 方法

你BaseActivity 的onCreate 是这样写的

  @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (null != onCreatePresenter()){
            mPresenter =onCreatePresenter();
        }
        AppManager.newInstance().addActivivty(this);
        setContentView(getContentViewId());
        initViews();
        addListener();
        initData();
    }

然后你又在MainActiviy 又从新写了onCreate方法

   @Override
    protected void onCreate(Bundle savedInstanceState) {
       
        //!!!重点这句话!!!
        //这句话是不是相当于吧BaseActivity的Oncreate方法,
         //所以initViews 方法先执行了,
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.activity_main);
        //initViews 都走完了,mViewPager才被赋值的
        mViewPager = findViewById(R.id.home_ViewPager);
        mTabLayout = findViewById(R.id.tab_layout);
 
    }

你看你在子类onCreate方法里面调用super.onCreate 方法,是不是父类的onCreate写执行了,父类的onCreate执行,是不是initViews 就执行了

 

解决方案:

 子类不要重写onCreate方法了,onCreate方法删掉,直接吧findviewId放在initViews里面就行

  @Override
    public void initViews() {

        mViewPager = findViewById(R.id.home_ViewPager);
        mTabLayout = findViewById(R.id.tab_layout);

        receiveAdDownload();
        initFragmentList();
        initFragments();
        initLabeView();
    }

 

 

总结:父类子类代码执行的顺序要搞清楚,搞清楚父类写那些抽象方法的意义。

判断所有可能出现空指针的地方

mainactivity 112行 adapter null