我正在使用以下代码来填充自定义ListPreference对话框。由于填充过程需要花费大量时间,因此我希望在填充过程中显示进度对话框。
我的问题是,filler.execute()不会阻止onPrepareDialogBuilder,并且函数会在值填充之前一直运行,导致异常......有什么想法吗?
@Override
protected void onPrepareDialogBuilder(Builder builder) {
// Load data
if (this.getEntries()==null) {
FillerTask filler = new FillerTask();
filler.execute();
}
Log.d(TAG, "Filler finished");
super.onPrepareDialogBuilder(builder);
}
这是Filltertask代码,基本上他会查找MAIN Intent填充列表的每个活动:
private class FillerTask extends AsyncTask<Void, Void, String[][]> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
Log.d(TAG, "Dismiss dialog");
dialog = ProgressDialog.show(MyListPreference.this.getContext(), "", "Doing stuff...", true);
}
@Override
protected String[][] doInBackground(Void... params) {
return fill();
}
public String[][] fill() {
Log.d(TAG, "Fill started");
CREATE LISTS...
// Done
Log.d(TAG, "Fill done");
String[][] result = new String[][] {entryNames, entryValues};
return result;
}
@Override
protected void onPostExecute(String[][] result) {
Log.d(TAG, "Post execute");
MyListPreference.this.setEntries(result[0]);
MyListPreference.this.setEntryValues(result[1]);
dialog.dismiss();
}
}
答案 0 :(得分:2)
我的问题是,filler.execute()不会阻止onPrepareDialogBuilder,并且函数会在值填充之前一直运行,导致异常......有什么想法吗?
这是AsyncTask
背后的全部观点。 AsyncTask
中的“异步”表示异步。
使用AsyncTask
获取数据。然后,在onPostExecute()
中,显示对话框。
答案 1 :(得分:0)
找到解决方案,执行此操作的最佳方法是覆盖onClick方法并让AsyncTask postExecute调用“super()”,因此在内容加载并且正确显示加载进度条期间,不会通过单击。
答案 2 :(得分:0)
asyntask
没有锁定主线程,它只是将消息丢弃到主线程的消息队列