Alin
Alin

Reputation: 14571

Showing ProgressDialog during UI Thread operation in Android

As I've asken on another question HERE it seems that the PackageManager.getInstalledPackages() doesn't play nice with Threading. As CommonsWare stated HERE:

Perhaps the PackageManager needs to be invoked on the main application thread, for some reason

So having it on a thread gets undesired behavior, entering and exiting a few times in my Activity makes the list of displayed apps sometimes with items, sometimes empty. Having everything in the UI Thread works like a dream, loads fine everytime. The thing is, the user expects some sort of feedback and I need to provide one. As I start the activity, the screen remains black for 3-4-5-6 seconds (depending on the device and apps installed). How can I provide some sort of feedback ? I am thinking of a ProgressDialog but I don't know how can I start it. Thank you.

Upvotes: 3

Views: 2161

Answers (3)

FunkTheMonk
FunkTheMonk

Reputation: 10938

As discovered, the loop to work through the applications takes awhile (which can be done in a separate thread), compared to the call to PackageManager.getInstalledPackages() (which has to be done on the UI thread).

Upvotes: 1

Arslan Anwar
Arslan Anwar

Reputation: 18746

Use Async to do background work and show indicator while loading data.

in you onCreate(). call 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();
            }
        }

    }
}

Upvotes: 1

devanshu_kaushik
devanshu_kaushik

Reputation: 969

Try the following for ProgressDialog in the onCreate() of your activity

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

And then dismiss it when the process causing the delay is over

LoadingDialog.dismiss();

Upvotes: 0

Related Questions