Android应用跳转第四Activity崩溃求助及优化方案咨询
首先咱们先明确崩溃的直接原因:你最后一个Activity的布局文件activity_last.xml里完全没有定义任何RadioGroup或RadioButton,所以当你调用findViewById(R.id.sort_b_r_g)时,返回的是null,紧接着调用null.getCheckedRadioButtonId()自然就抛出了NullPointerException,这就是应用崩溃的根源。
你用public static变量临时解决问题,虽然能跑起来,但这种做法有不少隐患:比如当应用进程被系统回收再重启时,static变量会丢失数据;而且static变量会一直占用内存,不符合Android的内存管理规范,不是长久之计。
下面给你几个更规范、更可靠的优化方案:
方案1:用Intent传递数据(最基础的跨Activity通信方式)
每个负责收集答案的Activity,在跳转到下一个Activity时,把当前收集到的答案通过Intent的putExtra方法传递过去,最后一个Activity从Intent中取出所有数据进行计算。
举个简单的例子:
- 在第二个Activity收集完性别答案后:
Intent intent = new Intent(SecondActivity.this, ThirdActivity.class); // 假设选中的性别是字符串"male"或"female" intent.putExtra("sex", selectedSex); startActivity(intent);
- 后续每个Activity都按这个方式传递自己收集的答案,最后在LastActivity中取出所有数据:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_last); // 从Intent中取出所有之前传递的答案 String sex = getIntent().getStringExtra("sex"); String sortB = getIntent().getStringExtra("sort_b"); String winter = getIntent().getStringExtra("winter"); // ... 取出其他所有答案 // 接下来执行你的计算逻辑 calculateResult(sex, sortB, winter, ...); }
方案2:使用ViewModel(推荐,应对配置变化更稳定)
如果你的应用需要处理屏幕旋转这类配置变化,或者希望更优雅地共享数据,可以使用Android Architecture Components中的ViewModel。它能在配置变化时保留数据,而且不需要依赖static变量。
步骤大概是:
- 创建一个共享的ViewModel类:
public class AnswerViewModel extends ViewModel { private String sex; private String sortB; private String winter; // ... 定义其他答案变量 // 提供setter和getter方法 public void setSex(String sex) { this.sex = sex; } public String getSex() { return sex; } // ... 其他getter/setter }
- 在每个收集答案的Activity中获取ViewModel实例,存储答案:
// 在第二个Activity中 AnswerViewModel viewModel = new ViewModelProvider(this).get(AnswerViewModel.class); viewModel.setSex(selectedSex);
- 在LastActivity中获取同一个ViewModel实例,取出所有答案计算:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_last); AnswerViewModel viewModel = new ViewModelProvider(this).get(AnswerViewModel.class); String sex = viewModel.getSex(); String sortB = viewModel.getSortB(); // ... 取出其他答案 calculateResult(sex, sortB, ...); }
方案3:使用SharedPreferences(适合需要持久化的场景)
如果你的答案需要在用户退出应用后仍然保留,可以用SharedPreferences来存储每个答案,最后在LastActivity中读取所有数据计算。
示例代码:
- 在收集答案的Activity中存储:
SharedPreferences sp = getSharedPreferences("AnswerPrefs", MODE_PRIVATE); sp.edit().putString("sex", selectedSex).apply();
- 在LastActivity中读取:
SharedPreferences sp = getSharedPreferences("AnswerPrefs", MODE_PRIVATE); String sex = sp.getString("sex", ""); // ... 读取其他答案
最后还要提醒你:LastActivity的职责应该是计算并展示结果,不应该再去查找RadioGroup这类收集答案的控件,答案应该由前面的Activity收集好再传递过来,这样代码职责更清晰,也能避免类似的空指针问题。
内容的提问来源于stack exchange,提问作者Ygl

