android - 以编程方式添加视图阻塞主线程
问题描述
我的 UI 中有一个 flexboxlayout,我想向它动态添加文本视图。请在下面找到代码。
private void addOption(String option) {
new Thread(new Runnable() {
@Override
public void run() {
TextView textView = new TextView(_context);
textView.setText(option);
textView.setBackgroundResource(R.drawable.profile_round_coner_shape);
textView.setTextColor(Color.parseColor("#00324b"));
textView.setAllCaps(true);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10f);
textView.setPadding((int) Utils.dp2px(_context, 6), (int) Utils.dp2px(_context, 7), (int) Utils.dp2px(_context, 6), (int) Utils.dp2px(_context, 7));
FlexboxLayout.LayoutParams params = new FlexboxLayout.LayoutParams(FlexboxLayout.LayoutParams.WRAP_CONTENT, FlexboxLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(0, (int) Utils.dp2px(_context, 2), (int) Utils.dp2px(_context, 4), 0);
textView.setLayoutParams(params);
handlerOverlow.post(new Runnable() {
@Override
public void run() {
flexboxLayoutOptions.addView(textView);
}
});
}
}).start();
}
我在 for 循环中调用此方法。
for (int i = 1; i < allOptions.size(); i++) {
addOption(allOptions.get(i).getOptionName());
}
即使我将它写在一个线程中,它也会花费相当长的时间来执行,并且在此期间 UI 不会响应。有什么想法可以解决这个问题吗?(数组大小超过200)
解决方案
由于您使用不同的威胁来创建您的 textview 列表,因此您不能直接从某个不同的线程修改主线程。所以必须使用以下方式。
new Thread(new Runnable() {
@Override
public void run() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//your code
}
});
}
});
推荐阅读
- liferay-7 - 全新安装 Liferay 时登录失败
- python-3.x - 自添加打印以来的 RPLY 无效令牌错误
- android - 从图库中选择图像时如何避免关闭弹出窗口?
- javascript - 如何避免 UI5 中的“主线程上的同步 XMLHttpRequest”警告?
- ruby - 如何找到给定输入值以下的所有素数?
- ios - iOS transform3D,两个视图X轴旋转,改变视图层次,为什么?
- laravel - Laradock 上的 Spatie Laravel 备份无法打开目录容器数据/mysql/#innodb_temp 权限被拒绝
- javascript - 呈现数字数组的 React 组件的不同背景颜色
- javascript - 如何将 Javascript 鼠标悬停 css 效果应用于具有相同类名的所有元素?
- python - 托管在heroku上时如何让fibit python工作?