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);
我正在从一个 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);