- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我迷路了。我需要读取目录中的文件并在应用程序启动时从中创建按钮。我必须使用 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 1Default 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/
我是一名优秀的程序员,十分优秀!