我有一个 xml 解析器,它解析一个带有 1056 个我在本地获取的信息标签的大文件(不是基于 url)。
我想在这个东西通过for循环运行时显示一个对话框,但我只是看到一个白屏,直到所有加载完成。我试过在几个不同的地方添加一个 dialog.show() ,甚至在 onCreate 没有任何成功。我在这里想念什么?我曾尝试在 Handler 和 Async 中运行此方法,但每次都会出现 Not On Main Thread 错误...您如何在主线程上运行带有对话框的长任务?
在我的 onCreate 中,我只是这样做(以及其他正常的布局、操作栏等......):
buildMap();
这是我的方法:
public void buildMap() {
try {
File fXmlFile = new File(
"/storage/emulated/0/snoteldata/kml/snotelwithlabels.kml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagName("Placemark");
int temp;
for (temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
String name = eElement.getElementsByTagName("name").item(0)
.getTextContent();
Spanned desc = Html.fromHtml(eElement
.getElementsByTagName("description").item(0)
.getTextContent());
String lon = eElement.getElementsByTagName("longitude")
.item(0).getTextContent();
String lat = eElement.getElementsByTagName("latitude")
.item(0).getTextContent();
lon = lon.trim();
lat = lat.trim();
double lati = Double.parseDouble(lat);
double lngi = Double.parseDouble(lon);
LatLng LOCATION = new LatLng(lati, lngi);
map.addMarker(new MarkerOptions()
.position(LOCATION)
.title(name)
.snippet(desc.toString())
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.wfmi_icon48)));
map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker arg0) {
msg(arg0.getSnippet());
}
});
}
}
showLocation();
} catch (Exception e) {
Log.e("SnoTelData Buildmap Error", e.getMessage());
}
}
如何显示这个 for 循环正在运行并等待一秒钟?
编辑::::
感谢您的回复。我已经尝试过没有成功的建议。我收到 Not on Main Thread 错误。
这是我的异步任务:
private class BuildTask extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
buildMap();
return null;
}
protected void onPreExecute() {
dialog.show();
}
protected void onPostExecute(Void result) {
dialog.cancel();
}
}
我从 onCreate 调用 if:
new BuildTask().execute();
为什么我仍然得到不在主线程上的错误?我正在从 onCreate 执行此操作。