我正在开发一个带有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实际上会关闭。有关我出错的地方或如何继续追踪此事的想法吗?
答案 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在其他任何操作之前被调用。