gpt4 book ai didi

java - 在android中发现Handlers的这种奇怪的行为

转载 作者:行者123 更新时间:2023-12-02 04:19:39 24 4
gpt4 key购买 nike

我刚刚编写了一段代码,其中添加了多个 View ,每个 View 都使用一个处理程序。这些是使用 for 循环添加的。这些添加得恰到好处。然后我尝试在 for 循环之后添加一个按钮,而不使用处理程序。这次按钮显示在布局的顶部,即在 for 循环中添加的项目之前。如果我使用处理程序添加按钮,则不会发生这种情况。

因此,如果我在循环后使用以下带有处理程序的代码,则该按钮将添加到布局的底部:

 private void fillFeedWithData(final List<ParseObject> feedObjectList) {

LayoutInflater inflaterOfFeedItem = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

for (int i = 0; i < feedObjectList.size(); i++) {

final String jokeTitle = feedObjectList.get(i).getString("content");

final View cvFeedItem = inflaterOfFeedItem.inflate(R.layout.feed_item_theme_card, null);

final TextView tvJoke = (TextView) cvFeedItem.findViewById(R.id.tvFeedJoke);

Handler h2 = new Handler();
Runnable update2 = new Runnable() {
public void run() {
tvJoke.setText(jokeTitle);
llFragmentFeedParent.addView(cvFeedItem);
// llFragmentFeedParent is acquired in OnCreate() method
}
};
h2.post(update2);
}


final Button bNext = new Button(this);
bNext.setText("Next >");
bNext.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

Handler h3 = new Handler();
Runnable update3 = new Runnable() {
public void run() {
llFragmentFeedParent.addView(bNext);
}
};
h3.post(update3);
}

如果我在循环后使用以下代码,则按钮将添加到布局的顶部:

    Button bNext = new Button(this);
bNext.setText("Next >");
bNext.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
llFragmentFeedParent.addView(bNext);

现在我的应用程序正在按预期与处理程序一起工作,但我担心为什么会发生这种情况。我认为处理程序混淆了执行的时间/顺序?如果我继续使用该逻辑,在速度较慢的手机中,该按钮是否有可能出现在循环中添加的项目的顶部甚至之间?

最佳答案

我不知道你为什么要这样做,但回答你的问题。处理程序将 Runnables 发布到按顺序运行的队列中(假设您不使用 postDelayed)。它们最终运行,这意味着它们的执行时间完全取决于发布的其他 Runnable 数量以及这些 Runnable 执行所需的时间。

处理程序实际上共享一个创建它们的Looper线程(在本例中是主UI Looper线程),因此无论您创建多少个处理程序引用,它们都会在同一个线程中发布。同样,您可以传入另一个线程的 Looper 对象,以便 Runnables 将在该线程上运行。

在这种情况下,当您添加不带处理程序的按钮时,您将在其他处理程序执行之前立即将其添加到 View 中。当您发布另一个处理程序时(该处理程序也是在 UI 线程上创建的),它将在您发布的第一个处理程序之后将 Runnable 发布到队列中。那么它们就有效地按顺序运行。

编辑:

同样在这种情况下,我会完全放弃 Handler 机制,只需将要添加的所有 View 放入 List 中,然后将它们添加到集合中。您将在每个 channel 中发布一个新的 Runnable,这将向布局添加一个新 View ,这将触发布局 channel ,这将触发绘制 channel 。最好一次性将它们全部添加。

关于java - 在android中发现Handlers的这种奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32924740/

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