Android 如何创建第二个线程,让progressdialog暂停主线程?
对不起,我是Android编程新手。我有一个不想在UI线程中运行的xml解析器。我想在解析器在自己的线程中运行时显示progressdialog,但我不希望主线程在解析器完成之前启动下一个活动。我有代码,但progressdialog不会在整个过程中显示。代替while循环,我尝试了parserThread.join(),得到了相同的结果。另外,我希望避免UI线程超时。感谢您的帮助 调用线程的方法,后面是实现Runnable的类:Android 如何创建第二个线程,让progressdialog暂停主线程?,android,multithreading,parsing,progressdialog,Android,Multithreading,Parsing,Progressdialog,对不起,我是Android编程新手。我有一个不想在UI线程中运行的xml解析器。我想在解析器在自己的线程中运行时显示progressdialog,但我不希望主线程在解析器完成之前启动下一个活动。我有代码,但progressdialog不会在整个过程中显示。代替while循环,我尝试了parserThread.join(),得到了相同的结果。另外,我希望避免UI线程超时。感谢您的帮助 调用线程的方法,后面是实现Runnable的类: private void parseGasStationData
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();
}
在android中,我们使用
AsyncTask
类进行后台操作并显示结果。请参见主文档页面。第一个示例似乎对您非常有用,只需更改解析器的doInBackground
方法。此代码:
while (parserThread.isAlive()) {
// do nothing
}
我得走了。只要你有这样一个线程,你最好不要使用一个单独的线程。(事实上,情况更糟,因为它是一个占用CPU的“”文件。)
正确的方法是回电话。解析线程完成后,它可以调用
post(Runnable)
在UI线程上运行一个进程,该进程将使进度对话框消失。你可以用它来帮我。有关更多信息,请参阅指南主题。AsyncTask似乎有一个非常模糊的API。我正在尝试,到目前为止,我无法关闭Progressdialog,也不知道如何将arraylist返回到调用类。AsyncTask旨在通过其onPostExecute
方法传递结果。在这里,您可以关闭“进度”对话框并设置arraylist。您不应该将其视为调用方法并返回结果。您启动一个单独的线程,该线程按照自己的时间表运行,并在工作完成后向主线程报告。主线程的设计需要考虑到这种解耦。主线程应该启动AsyncTask/worker线程,然后将控制权返回操作系统(以避免出现“应用程序无响应”错误)。使用AsyncTask时是否需要一个getter方法返回arrayList?最终,UI线程将启动另一个活动。我不希望解析器在下一个活动中运行。这如何确保解析器在下一个活动开始之前完成?在AsyncTask的onPostExecute
方法中,可以启动第二个活动,也可以调用主活动的方法,将结果传递给它onPostExecute
将仅在doInBackground
方法完成并在UI线程上运行后调用。如果将AsyncTask设置为活动的内部类,则可以从onPostExecute
中完全访问活动的字段和方法。我让它工作了。我看它有些智慧。它有一个get()方法,确切地知道我想要返回什么。