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