点击单选按钮应用崩溃:疑变量声明问题,附Logcat报错
咱们先从你贴的代码里找最直接的问题——amount变量的赋值完全错了,这大概率是导致崩溃的核心原因:
Double amount = 0.0; amount.valueOf(textTotalPrice.toString());
这里有两个致命问题:
valueOf是Double类的静态方法,不能用实例对象amount去调用,而且你根本没把返回值赋值给amount,所以amount一直是初始的0.0,后续的余额判断逻辑完全失效。textTotalPrice.toString()拿的是TextView这个控件对象的字符串标识(类似android.widget.TextView@abc123),不是你要的价格文本内容,得用textTotalPrice.getText().toString()才能拿到用户看到的价格。
所以这段代码必须改成这样,还要加异常处理防止输入不是数字的情况:
Double amount = 0.0; try { amount = Double.valueOf(textTotalPrice.getText().toString()); } catch (NumberFormatException e) { Toast.makeText(Cart.this, "请输入有效的价格", Toast.LENGTH_SHORT).show(); return; // 直接终止后续逻辑,避免崩溃 }
然后看你提供的Logcat错误:
2020-01-30 11:56:15.100 3255-3749/? E/DatabaseUtils: Writing exception to parcel
java.lang.IllegalArgumentException: You cannot keep your settings in the secure settings.
at com.android.providers.settings.SettingsProvider.warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk(SettingsProvider.java:2105)
...
这个错误和你当前的订单提交代码没关系,是系统设置服务抛出的异常,说明你的应用里(或者依赖的第三方库)有代码在尝试修改系统的安全设置(比如调用Settings.Secure.putXXX()这类方法),你可以排查下其他模块的代码。
另外给你提个小优化点:更新Firebase余额后,你不需要再查一次数据库更新Common.currentUser,直接在内存里改就行,省一次网络请求:
if (task.isSuccessful()) { // 直接更新内存中的用户对象,不用再查数据库 Common.currentUser.setBalance(balance); }
最后建议你测试时抓完整的崩溃Logcat,当前的这个错误栈和你点击单选按钮的崩溃应该不相关,找到对应你应用进程的异常信息,能更快定位问题。
内容的提问来源于stack exchange,提问作者KDD

