2

我正在使用以下代码来填充自定义 ListPreference 对话框。由于填充过程需要很多时间,我想在填充过程中显示一个进度对话框。

我的问题是,filler.execute() 不会阻止 onPrepareDialogBu​​ilder 并且函数在值被填充之前一直运行到最后导致异常......知道吗?

@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();
    }
 }  
4

3 回答 3

2

我的问题是,filler.execute() 不会阻止 onPrepareDialogBu​​ilder 并且函数在值被填充之前一直运行到最后导致异常......知道吗?

这就是AsyncTask. 中的“异步”AsyncTask表示异步。

使用您的AsyncTask来获取您的数据。然后,在 中onPostExecute(),显示对话框。

于 2010-12-21T14:54:13.190 回答
0

找到解决方案,最好的方法是覆盖 onClick 方法并让 AsyncTask postExecute 调用“super()”,因此在加载内容并正确显示加载进度条之前不会传递单击。

于 2010-12-22T21:05:33.537 回答
0

asyntask不锁定主线程,它只是将消息丢到主线程的消息队列中

于 2012-03-21T08:26:01.110 回答