【问题标题】:Showing ProgressDialog during UI Thread operation in Android在Android中的UI Thread操作期间显示ProgressDialog
【发布时间】:2011-11-14 12:21:52
【问题描述】:

正如我在另一个问题HERE 上所问的那样,PackageManager.getInstalledPackages() 似乎与线程处理不兼容。正如 CommonsWare 所说 HERE:

可能需要在主应用程序上调用 PackageManager 线程,出于某种原因

因此,将它放在线程上会产生不良行为,在我的 Activity 中多次进入和退出会使显示的应用程序列表有时带有项目,有时为空。拥有 UI 线程中的所有内容就像做梦一样,每次加载都很好。问题是,用户期望某种反馈,而我需要提供反馈。当我开始活动时,屏幕保持黑屏 3-4-5-6 秒(取决于安装的设备和应用程序)。我怎样才能提供某种反馈?我正在考虑 ProgressDialog 但我不知道如何启动它。谢谢。

【问题讨论】:

  • 我怀疑不是这样,但你确定它是对 PackageManager.getInstalledPackages() 的调用需要时间,而不是循环通过返回的数据使其暂停?您可以在主线程上获取数据,然后在 AsyncTask 中循环遍历它,但我怀疑这是问题所在。
  • 实际上你是对的,在 UI 线程中获取 intalled Packages() 并在 AsyncTask 中进行循环就可以完成这项工作。写一个答案,这样我就可以接受了。谢谢

标签: android multithreading android-asynctask progressdialog


【解决方案1】:

正如我们所发现的,与对 PackageManager.getInstalledPackages() 的调用(必须在 UI 线程上完成)相比,循环处理应用程序需要一段时间(可以在单独的线程中完成)。

【讨论】:

【解决方案2】:

使用 Async 进行后台工作并在加载数据时显示指示器。

在您的 onCreate() 中。拨打new AsyncCommonDataFetcher(this).execute();

public class AsyncCommonDataFetcher extends AsyncTask<Void, Void, Void> {

    Context mContext = null;
    private ProgressDialog mProgressIndicator = null;

    public AsyncCommonDataFetcher(Context ctx) {
        mContext = ctx;
    }

protected void onPreExecute() {
        mProgressIndicator = ProgressDialog.show(((Activity) mContext), null,
                    "Please wait", true);

    }
    @Override
    protected Void doInBackground(Void... voids) {
        // Do what ever work you like to do. It will do this in backgound and show user a indicator to wait.
    }

    @Override
    protected void onPostExecute(Void voidInstance) {


            try {
                if (mProgressIndicator != null) {
                    mProgressIndicator.hide();
                    mProgressIndicator.dismiss();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }

    }
}

【讨论】:

【解决方案3】:

在你的活动的 onCreate() 中为 ProgressDialog 尝试以下操作

this.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
ProgressDialog LoadingDialog = ProgressDialog.show(this, "", "Loading..", true);

然后在导致延迟的进程结束时关闭它

LoadingDialog.dismiss();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多