onActivityResult 是异步的,我的 ProgressBar 没有显示

onActivityResult is asynchronous and my ProgressBar is not shown

我正在从一个 DialogFragment 开始一个 ACTION_GET_CONTENT 意图,用户可以在其中 select 文件。 当文件被 selected 时,activity 完成并执行 onActivityResult 结果。

onActivityResult 中,我正在读取文件的输入流,这可能需要一段时间,因为有些文件是从 Internet 下载的。

为了向用户提供反馈,我想显示一个确定的进度条。问题是 onActivityResult 完成后才显示进度条。我在 运行 调试器时发现了这一点。

如何在执行时显示进度对话框onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, final Intent data) {
    // TODO Fix no activity available
    if (data == null)
        return;
    switch (requestCode) {
        case PICKFILE_RESULT_CODE:
            if (resultCode == Activity.RESULT_OK) {
                final ClipData clipData = data.getClipData();
                if (clipData != null) {
                    for (int i = 0; i < clipData.getItemCount(); i++){
                        final ClipData.Item item = clipData.getItemAt(i);
                        addAttachment(item.getUri());
                    }
                } else {
                    addAttachment(data.getData());
                }
            }
    }
}


private void addAttachment(Uri uri) {
    File file;

    String filePath = AttachmentUtils.getPath(getContext(), uri);
    if (!Utils.isEmpty(filePath)) {
        file = new File(filePath);
    } else {


        ProgressDialog progressDialog = new ProgressDialog(getActivity());
        progressDialog.setIndeterminate(false);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setMessage("Bezig met downloaden");
        progressDialog.show();

        file = AttachmentUtils.getFileFromStream(getActivity(), uri, progressDialog);

        progressDialog.hide();

        return;
    }

   //some more code where I do things with the files after download

}

这样改

@Override
public void onActivityResult(int requestCode, int resultCode, final Intent data) {
// TODO Fix no activity available
ProgressDialog progressDialog;
if (data == null)
    return;
switch (requestCode) {
    case PICKFILE_RESULT_CODE:

    progressDialog = new ProgressDialog(getActivity());
    progressDialog.setIndeterminate(false);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setCanceledOnTouchOutside(false);
    progressDialog.setMessage("Bezig met downloaden");
    progressDialog.show();


        if (resultCode == Activity.RESULT_OK) {
            final ClipData clipData = data.getClipData();
            if (clipData != null) {
                for (int i = 0; i < clipData.getItemCount(); i++){
                    final ClipData.Item item = clipData.getItemAt(i);
                    addAttachment(item.getUri());
                }
            } else {
                addAttachment(data.getData());
            progressDialog.dismiss();
            }
        }
}
}


private void addAttachment(Uri uri) {
File file;

String filePath = AttachmentUtils.getPath(getContext(), uri);
if (!Utils.isEmpty(filePath)) {
    file = new File(filePath);
} else {



    file = AttachmentUtils.getFileFromStream(getActivity(), uri, progressDialog);


    return;
}

 //some more code where I do things with the files after download

}

希望对您有所帮助

当您需要从服务器下载时,需要在后台线程中执行这些任务。为此,启动一个 AsyncTask 对象并执行以下操作

@Override
    protected void onPreExecute() {
        dlg = new ProgressDialog(ctx);
        dlg.setMessage("Loading....");
        super.onPreExecute();
    }

@Override
protected void onPostExecute(Object result) {
    dlg.dismiss();
    if ( result instanceof Exception ) {
        // show error message
    } else {
        // display data
    }
    super.onPostExecute(result);
}

@Override
protected Object doInBackground(Object... params) {

    try {

    // return data;
    } catch ( Exception e ) {
        return e;
    }

}

检查下面是否在 ui 线程或另一个线程上调用 运行。隐藏进度条对话框结束getFileFromStream。不要在下一行调用。

AttachmentUtils.getFileFromStream(getActivity(), uri, progressDialog);