gpt4 book ai didi

android - 在单独的线程中使用 while 循环生成 android 按钮

转载 作者:行者123 更新时间:2023-11-30 03:24:03 25 4
gpt4 key购买 nike

我迷路了。我需要读取目录中的文件并在应用程序启动时从中创建按钮。我必须使用 while 循环,并且必须更新 UI。我已经尝试了很长时间来运行可运行对象,并且只有循环内的代码在 UI 线程中运行。我是 android 的新手,但这似乎很简单。

这段代码是我现在拥有的。它不会抛出任何错误或警告,但不会执行任何操作。我知道制作代码的按钮有效,因为“添加按钮”按钮可以正确制作按钮。我不知道为什么它不起作用。 (这在 OnCreate 中运行)

Runnable aRunnable = new Runnable() {

public void run() {
Looper.prepare();
File f = new File(Environment.getExternalStorageDirectory() + "/myapp/");
File[] filearray = f.listFiles();
int amount = filearray.length;
final String[] files = new String[amount];
int count = 0;
while (count != amount) {
files[count] = filearray[count].toString();
count += 1;
}
int times = files.length;
int counter = 0;
while (counter != times) {
Handler handler = new Handler();
handler.post(new Runnable() {
public void run() {
// Button making code
}
});
}
Looper.loop();
}
};
Thread thread = new Thread(aRunnable);
thread.start();

最佳答案

现有代码的一个问题是 run() 方法中的所有内容都在后台线程上运行,而不是主线程(有时称为 UI)。

这是您创建处理程序对象的地方:

        Handler handler = new Handler();

这是不正确的。如果使用默认构造函数,则需要在主线程上创建(实例化)Handler。来自 the Handler docs :

public Handler () Added in API level 1

Default constructor associates this handler with the Looper for the current thread. If this thread does not have a looper, this handler won't be able to receive messages so an exception is thrown.

因此,一个简单的修复方法就是将该行代码移到更早的位置,并将其移至您知道在主线程上运行的位置。 For example, in Activity#onCreate() :

public void onCreate(Bundle b) {
super.onCreate(b);

handler = new Handler();
}

其中handler被改成成员变量:

private Handler handler;

此外,只需删除您的 Looper 调用即可。

See this article for more on Handler .

其他选项

另一种选择是完全避免使用 Handler,并熟悉 AsyncTask class .我个人认为这对于新开发人员来说更容易使用。我显示的 vogella.com 链接也有关于 AsyncTask 的有用信息。

还有一个选择是避免 Handler 并使用 runOnUiThread()Activity 中添加按钮的方法。

关于android - 在单独的线程中使用 while 循环生成 android 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18563127/

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