抱歉,我是Android编程新手。我有一个xml解析器,我不想在UI线程中运行。我希望在解析器在其自己的线程中运行时显示progressdialog但我不希望主线程在解析器完成之前启动下一个Activity。我有代码,但progressdialog不会显示整个持续时间。代替while循环,我尝试使用相同结果的parserThread.join()。另外,我想避免超时UI线程。任何帮助表示赞赏。
调用线程的方法,后跟实现Runnable的类:
private void parseGasStationData() {
gasStations = null;
StationParser sp = new StationParser(activity);
Thread parserThread = new Thread(sp);
parserThread.start();
while (parserThread.isAlive()) {
// do nothing
}
gasStations = sp.getList();
Log.v("Parser-Status", "xml parsed successfully: "
+ (gasStations != null));
}
public class StationParser implements Runnable {
private Activity activity;
private final ProgressDialog pd;
public StationParser(Activity activity) {
this.activity = activity;
pd = ProgressDialog.show(activity, "", "Parsing data...", true, false);
}
@Override
public void run() {
try {
runParser();
} catch (XmlPullParserException e) {
Log.e("Parser-Error", "XmlPullParserException", e);
e.printStackTrace();
} catch (IOException e) {
Log.e("Parser-Error", "IOException", e);
e.printStackTrace();
} catch (ParseException e) {
Log.e("Parser-Error", "ParseException", e);
e.printStackTrace();
}
pd.dismiss();
}
答案 0 :(得分:0)
在android中,我们使用AsyncTask
类使后台操作显示结果。请参阅主文档页面here,第一个示例对您来说非常有用,只需更改解析器的doInBackground
方法即可。
答案 1 :(得分:0)
此代码:
while (parserThread.isAlive()) {
// do nothing
}
需要去。只要你拥有它,你可能根本就不使用单独的线程。 (事实上,它更糟糕,因为它是一个占用CPU的“busy wait”。)
这样做的正确方法是回拨。解析线程完成后,它可以调用post(Runnable)
在UI线程上运行一个进程,使进程对话框消失。您可以使用AsyncTask来帮助解决此问题。有关详细信息,请参阅指南主题Processes and Threads。