android - 使用 100 个 EditFields 和 TextFields 开发应用程序
问题描述
我正在开发一个包含 100 个文本字段和编辑字段的应用程序。在其中很多中,我使用 textwatcher 来收听更改并更新其他文本字段。我在这件事上没有太多选择,因为很多领域都是相互依赖的。但是该应用程序遇到了很多性能问题。它冻结了很多。我可以得到一些关于开发具有大量文本字段的应用程序的提示吗?我认为我使用的所有文本观察器都在减慢 ui 线程。
//Business Operating Cost
TextWatcher businessOperatingCostTextWatcher = new TextWatcher() {
private double edtTaxPayment = 0.0;
private double txtPaymentBusinessLoan = 0.0;
private double edtOtherBusiness = 0.0;
private double edtBasicServices = 0.0;
private double edtTransport = 0.0;
private double edtLocalRental = 0.0;
private double edtSalaries = 0.0;
private double unforeseen = 0.0;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (mCashFlowBinding.edtSalaries != null && mCashFlowBinding.edtSalaries.length() != 0) {
edtSalaries = Double.parseDouble(mCashFlowBinding.edtSalaries.getText().toString());
}
if (mCashFlowBinding.edtLocalRental != null && mCashFlowBinding.edtLocalRental.length() != 0) {
edtLocalRental = Double.parseDouble(mCashFlowBinding.edtLocalRental.getText().toString());
}
if (mCashFlowBinding.edtTransport != null && mCashFlowBinding.edtTransport.length() != 0) {
edtTransport = Double.parseDouble(mCashFlowBinding.edtTransport.getText().toString());
}
if (mCashFlowBinding.edtBasicServices != null && mCashFlowBinding.edtBasicServices.length() != 0) {
edtBasicServices = Double.parseDouble(mCashFlowBinding.edtBasicServices.getText().toString());
}
if (mCashFlowBinding.edtOtherBusiness != null && mCashFlowBinding.edtOtherBusiness.length() != 0) {
edtOtherBusiness = Double.parseDouble(mCashFlowBinding.edtOtherBusiness.getText().toString());
}
if (mCashFlowBinding.txtPaymentBusinessLoan != null && mCashFlowBinding.txtPaymentBusinessLoan.length() != 0) {
txtPaymentBusinessLoan = Double.parseDouble(mCashFlowBinding.txtPaymentBusinessLoan.getText().toString());
}
if (mCashFlowBinding.edtTaxPayment != null && mCashFlowBinding.edtTaxPayment.length() != 0) {
edtTaxPayment = Double.parseDouble(mCashFlowBinding.edtTaxPayment.getText().toString());
}
if (mCashFlowBinding.txtUnforseen != null && mCashFlowBinding.txtUnforseen.length() != 0) {
unforeseen = Double.parseDouble(mCashFlowBinding.txtUnforseen.getText().toString());
}
double resultSum = (edtTaxPayment + txtPaymentBusinessLoan + edtOtherBusiness + edtBasicServices + edtTransport + edtLocalRental + edtSalaries + unforeseen);
if (!Double.isNaN(resultSum) && !Double.isInfinite(resultSum)) {
mCashFlowBinding.txtBusinessOperatingCost1.setText(String.valueOf(resultSum));
} else {
mCashFlowBinding.txtBusinessOperatingCost1.setText("0.0");
}
}
};
mCashFlowBinding.edtSalaries.addTextChangedListener(businessOperatingCostTextWatcher);
mCashFlowBinding.edtLocalRental.addTextChangedListener(businessOperatingCostTextWatcher);
mCashFlowBinding.edtTransport.addTextChangedListener(businessOperatingCostTextWatcher);
mCashFlowBinding.edtBasicServices.addTextChangedListener(businessOperatingCostTextWatcher);
mCashFlowBinding.edtOtherBusiness.addTextChangedListener(businessOperatingCostTextWatcher);
mCashFlowBinding.txtPaymentBusinessLoan.addTextChangedListener(businessOperatingCostTextWatcher);
mCashFlowBinding.edtTaxPayment.addTextChangedListener(businessOperatingCostTextWatcher);
mCashFlowBinding.txtUnforseen.addTextChangedListener(businessOperatingCostTextWatcher);
解决方案
您可以做些什么来缓解主 UI 线程:
将 ViewModel 的一些 LiveData 暴露给 View,然后调用postValue
TextWatcher。然后它迅速释放。
在 LiveData 观察者中,您可以在单独的线程上处理处理并将结果再次发送到 LiveData 对象finalOperstingCosts
。
然后在此 LiveData 的观察者中将 Text 设置为该字段。
这样你就不会在主线程上运行长时间的任务。
推荐阅读
- python-3.x - .bat 使用 anaconda 提示符运行 python 脚本
- javascript - 快速路线中未定义的值
- jquery - Chrome (& new Edge) 不能用 JQuery 渲染汉字
- python - 如何修改我的 for 循环,使其在一次迭代后不会停止?
- c# - 获取值不能为空。参数名称:发布时的源,但不在调试中
- cefsharp - 无法加载文件或程序集“CefSharp.Core.Runtime.DLL”或其依赖项之一。指定的模块无法找到
- json - DJANGO ListView 返回 HTTPResponse,但我需要一个 json
- postgresql - Amazon AWS/RDS Postgres 免费套餐无法选择
- c# - c# 如果两个列表按升序排列,如何合并它们
- java - 我应该在每个服务 spring kafka 中创建 NewTopics 吗?