gpt4 book ai didi

android - 为什么 UI 线程和工作线程中的相同代码会导致不同的结果?

转载 作者:太空狗 更新时间:2023-10-29 14:55:38 26 4
gpt4 key购买 nike

我有一个棘手的问题。

  1. 有一个 RecyclerView
  2. RecyclerView 的每个 child 都有几个以编程方式生成的按钮:

List<Button> buttons = new ArrayList<>();
for (int k = 0; k < values.length; k++) {
String value = values[k];
Button btnAnswer = (Button)LayoutInflater.from(mContext).inflate( R.layout.button_answer_unpressed, mainLayout, false);
btnAnswer.setId(View.generateViewId());
mainLayout.addView(btnAnswer);
buttons.add(btnAnswer);
}
...
for (Button button:buttons) {
applyBlur(button, mainLayout);
}

  1. 有趣的部分从 applyBlur 方法开始。

3.1。实现线程(我只提供了区分两种实现的方法的一部分):

private void applyBlur(final View view, final View parent) {
...
parent.buildDrawingCache();
final Bitmap bmp = parent.getDrawingCache();
...
Bitmap blurredBitmap = blur(bmp, view);
view.setBackground(new BitmapDrawable(mContext.getResources(), blurredBitmap));
...
}

view变量是作为参数传递的 Button。函数blur产生模糊效果 :)(取自 here)并且效果很好。它看起来必须如此(请参阅模糊按钮): enter image description here

3.2。 线程实现:

private void applyBlur(final View view, final View parent) {
...
parent.buildDrawingCache();
final Bitmap bmp = parent.getDrawingCache();
...
new Thread(new Runnable() {
public void run() {
final Bitmap blurredBitmap = blur(bmp, view);
view.post(new Runnable() {
public void run() {
view.setBackground(new BitmapDrawable(mContext.getResources(), blurredBitmap));
}
});
}
}).start();
...
}

您可能会注意到代码保持不变,但只是放入了 Thread 中。但是结果不同: enter image description here

我也试过AsyncTaskAsyncTaskLoader但结果保持不变:只有最后一个 Button 变得模糊。如果我将所有内容都保留在主线程中 - 没关系,但不利于生产力。

我检查了 blurredBitmap始终正确生成。

为什么线程会导致 Button 的后台初始化崩溃?

最佳答案

试试这个:

List<Button> buttons = new ArrayList<>(values.length);

for(int k = 0; k < values.length; k++) {
buttons.add((Button) LayoutInflater.from(mContext).inflate(R.layout.button_answer_unpressed, mainLayout, false););
}

for (int k = 0; k < buttons.size(); k++) {
String value = values[k];
buttons.get(k).setId(View.generateViewId());
mainLayout.addView(buttons.get(k));
applyBlur(buttons.get(k), mainLayout);
}

并让你的 applyBlur 方法使用线程

关于android - 为什么 UI 线程和工作线程中的相同代码会导致不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31812358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com