我有一个适配器和一个微调器视图,该视图设置为将适配器用于其条目。我正在从 /assets/ 文件夹中的所有文件列表中向适配器添加项目,我发现此任务需要很长时间(对于 1.5Ghz 手机上的 2 个文件列表,甚至大约需要 2 秒!)。然后我想使用一个工作线程来收集我的列表,而不是阻塞 UI 线程。这是我的代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings);
adapter = new ArrayAdapter<String>(SettingsActivity.this, android.R.layout.simple_spinner_item, fontsName);
Spinner fontsSpinner = (Spinner) findViewById(R.id.settings_font_spinner);
fontsSpinner.setAdapter(adapter);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// The thread to gather font names from /assets/fonts/
thread = new Thread(){
@Override
public void run(){
try {
String[] fileList = getAssets().list("fonts");
if (fileList != null)
for (int i=0; i<fileList.length; i++) {
adapter.add(fileList[i]);
}
} catch (IOException e) {
}
runOnUiThread(new Runnable(){
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
}
};
thread.start();
}
但它会导致错误和崩溃:
08-17 13:54:01.017: E/AndroidRuntime(17929): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
我是否正确使用了 runOnUiThread()?!有趣的是,这段代码在不使用任何线程时可以完美运行,但它会阻塞 UI(这很痛苦)。
请问有什么帮助吗?