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です。「Async」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 に答える