调试关闭应用程序的神秘RecyclerView错误

时间:2017-06-30 21:42:35

标签: android debugging android-recyclerview

我正在开发一个带有RecyclerView的应用程序,我认为我几乎已经运行了,但遇到了一个奇怪的错误。

我做了一些小改动来纠正一个小错误,之后应用程序将不再完成主要活动布局的设置。相反,我得到了以下屏幕:

App closed --- App keeps closing

我的第一个想法是回顾我的微小变化。但他们没有引起这个问题。 (撤消这些更改并不能解决问题。)

我现在认为这个问题与应用程序在第一次“成功”(虽然有缺陷)运行和以下运行失败之间的运行方式有所变化有关。

在第一次运行中,应用程序必须请求用户的许可才能访问文档文件夹。但在此之后,应用程序不再需要询问,因为用户已经授予了权限。

这意味着在创建RecyclerView布局之前,执行顺序已更改。但我不能(还)弄清楚出了什么问题或如何解决它。

这是我主要活动中的OnCreate()方法:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_prog_summary);
}

这是OnCreate()方法&超类中的其他相关方法(实现权限请求的类):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    this.state = savedInstanceState;

    if (state != null) {
        isInPermission = state.getBoolean(STATE_IN_PERMISSION, false);
    }

    if (hasAllPermissions(getDesiredPermissions())) {
        onReady(state);
    }
    else if (!isInPermission) {
        isInPermission = true;

        ActivityCompat.requestPermissions(this,
                                    netPermissions(getDesiredPermissions()),
                                    REQUEST_PERMISSION);
    }
}

@Override
public void onRequestPermissionsResult(int      requestCode,
                                       String[] permissions,
                                       int[]    grantResults) {
    isInPermission = false;

    if (requestCode == REQUEST_PERMISSION) {
        if (hasAllPermissions(getDesiredPermissions())) {
            onReady(state);
        }
        else {
            onPermissionDenied();
        }
    }
}

这是我的activity类中的OnReady()方法(授予权限时调用):

@Override
protected void onReady(Bundle savedInstanceState) {
    _alEntries = new ArrayList();
    TaskData tdSource = new TaskData();

    // load task item array & trim the excess (unused) ArrayList space
    tdSource.LoadData(this, _alEntries);
    _alEntries.trimToSize();

    // create summary item array & populate it based on task item array
    _alSummaries = new ArrayList();
    PopulateSummaryList();

    _rv = (RecyclerView) findViewById(R.id.rvBookList);
    _li = getLayoutInflater();
    _rv.setLayoutManager(new LinearLayoutManager(this));

    _adapter = new TaskItemAdapter();
    _rv.setAdapter(_adapter);
}

当执行对setLayoutManager的调用时,app实际上会关闭。有关我出错的地方或如何继续追踪此事的想法吗?

1 个答案:

答案 0 :(得分:0)

似乎它可能是一个NullPointerException,因为你的_rv变量为null。根据代码判断它是有意义的,你的超类的onCreate方法调用onReady()BEFORE在你的子类的onCreate中调用setContentView(),因此在你的子类findViewById(R.id.rvBookList)中调用onReady()时将返回null,因为你没有' t设置课程的内容。要解决此问题,我建议您将超类设为abstract类。例如,在您的超类中执行以下操作:

public abstract class BaseActivity extends FragmentActivity {
    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        this.state = savedInstanceState;

        // ... remaining code from your superclass's onCreate()
    }

    public abstract int getLayoutId();
}

现在,在MainActivity中,扩展BaseActivity。由于BaseActivity是抽象的,getLayoutId()是一个抽象方法,它会强制你像这样实现getLayoutId()

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }

    @Override
    public int getLayoutId() {
        return R.layout.activity_prog_summary;
    }

}

执行此操作将确保继承超类的所有类都将执行正确的操作顺序,因为setContentView在其他任何操作之前被调用。