Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中的UI线程操作期间显示ProgressDialog_Android_Multithreading_Android Asynctask_Progressdialog - Fatal编程技术网

在Android中的UI线程操作期间显示ProgressDialog

在Android中的UI线程操作期间显示ProgressDialog,android,multithreading,android-asynctask,progressdialog,Android,Multithreading,Android Asynctask,Progressdialog,正如我在另一个问题上所问的,似乎PackageManager.getInstalledPackages()在线程方面做得不好。如公共软件所述 可能需要在主应用程序上调用PackageManager 因为某种原因 因此,将其放在线程上会导致不希望的行为,在“我的活动”中输入和退出几次会使显示的应用程序列表有时带有项目,有时为空。让UI线程中的所有内容都像梦一样工作,每次加载都很好。问题是,用户希望得到某种反馈,我需要提供一种反馈。当我开始活动时,屏幕会保持黑色3-4-5-6秒(取决于安装的设备和应

正如我在另一个问题上所问的,似乎PackageManager.getInstalledPackages()在线程方面做得不好。如公共软件所述

可能需要在主应用程序上调用PackageManager 因为某种原因


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

请在活动的onCreate()中尝试以下“进行进度”对话框

this.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
ProgressDialog LoadingDialog = ProgressDialog.show(this, "", "Loading..", true);
然后在导致延迟的进程结束时将其关闭

LoadingDialog.dismiss();

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

在您的onCreate()中。调用新的AsyncCommonDataFetcher(this.execute()

公共类AsyncCommonDataFetcher扩展了AsyncTask{
上下文mContext=null;
private ProgressDialog mProgressIndicator=null;
公共异步CommonDataFetcher(上下文ctx){
mContext=ctx;
}
受保护的void onPreExecute(){
mProgressIndicator=ProgressDialog.show(((活动)mContext),null,
“请稍等”,对);
}
@凌驾
受保护的空位背景(空位…空位){
//做任何你喜欢做的事情。它会在backgound中这样做,并向用户显示一个等待的指示器。
}
@凌驾
受保护的void onPostExecute(void voidInstance){
试一试{
如果(mProgressIndicator!=null){
mProgressIndicator.hide();
mProgressIndicator.disclose();
}
}捕获(异常e2){
e2.printStackTrace();
}
}
}
}

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

我怀疑不是这样,但您确定调用PackageManager.getInstalledPackages()需要时间吗,而不是通过返回的数据使其暂停的循环?您可以获取主线程上的数据,然后在AsyncTask中进行循环,但我怀疑这是问题所在。实际上,您是对的,在UI线程中获取完整的包()并在AsyncTask中进行循环可以正确完成任务。写一个答案,这样我就可以接受了。感谢您在OnPostexecute而不是doInbackround中完成任务。。。。。。因为它将导致运行时执行,如下所述,它真的必须在UI线程上执行吗?请看我的回答:
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();
            }
        }

    }
}