AsyncTask没有锁定主线程?

时间:2010-12-21 13:47:32

标签: android multithreading preferences android-asynctask listpreference

我正在使用以下代码来填充自定义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();
    }
 }  

3 个答案:

答案 0 :(得分:2)

  

我的问题是,filler.execute()不会阻止onPrepareDialogBu​​ilder,并且函数会在值填充之前一直运行,导致异常......有什么想法吗?

这是AsyncTask背后的全部观点。 AsyncTask中的“异步”表示异步。

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

答案 1 :(得分:0)

找到解决方案,执行此操作的最佳方法是覆盖onClick方法并让AsyncTask postExecute调用“super()”,因此在内容加载并且正确显示加载进度条期间,不会通过单击。

答案 2 :(得分:0)

asyntask没有锁定主线程,它只是将消息丢弃到主线程的消息队列