我迷失在这里。我需要读取目录中的文件,并在应用程序启动时从中创建按钮。我必须使用while循环,我必须更新UI。我已经尝试了很长一段时间来运行runnable并且只在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();
答案 0 :(得分:1)
现有代码的一个问题是run()
方法中的所有内容都在后台线程上运行,而不是主线程(有时称为 UI )线程。
这是您创建处理程序对象的地方:
Handler handler = new Handler();
这不正确。如果使用默认构造函数,则需要在主线程上创建(实例化)Handler
。来自the Handler docs:
public Handler ()
在API级别1中添加默认构造函数将此处理程序与Looper相关联 当前线程。如果这个线程没有looper,那么这个处理程序 将无法接收消息,因此会抛出异常。
因此,一个简单的修复就是将这行代码简单地移动到一个你知道在主线程上运行的地方。 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
并使用Activity
中的runOnUiThread()方法添加按钮。
答案 1 :(得分:0)
在我看来,你正在尝试根据某些数组获得一个按钮列表。这似乎是ListView和自定义数组适配器的工作。我相信你应该谷歌上面的一些例子(互联网上有数十亿,这是一个相当基本的Android模式)。
当你处于学习过程中时,不要忘记检查如何在Java中使用for()
,所有这些while
循环都是如此丑陋。