开发者

ProgressDialog working but not progressing in the icon (wheel)

I am using a simple progressDialog that running ok but the the wheel dose not progress:

    //Progress Dialog
            final ProgressDialog dialog = ProgressDialog.show(TravelPharm.this, "Searching","Please wait ...", true);
            ((ProgressDialog) dialog)
            .setProgressStyle(ProgressDialog.BUTTON_NEUTRAL);

            final Handler handler = new Handler() {
                       public void handleMessage(Message msg) {
                          dialog.dismiss();
                          }
                       };
                    Thread ch开发者_C百科eckUpdate = new Thread() {  
                       public void run() {

                          handler.sendEmptyMessage(0);
                          }
                       };
                    checkUpdate.start();

what i am missing??


Create your progress dialog like so:

final ProgressDialog progress = new ProgressDialog(context);

add some text/icon to it:

progress.setTitle("Loading");
progress.setMessage("Loading, please wait");
progress.setIcon(R.drawable.icon);

Show it:

progress.show();


I think you should pass ProgressDialog.STYLE_SPINNER to ProgressDialog.setProgressStyle() method.


final ProgressDialog dialog = ProgressDialog.show(TravelPharm.this, "Searching","Please wait ...", true);

The way you are creating the ProgressDialog is correct - if the spinner isn't spinning then something is blocking your UI thread.

Out of interest, why are you using TravelPharm.this for the context instead of this? I'm not sure it's the cause of your problem, I'm just wondering why.


I am guessing that you are launching a time intensive task from a dialog and then trapping the thread exit in your handler where you are trying to dismiss the dialog. If possible, consider simply sending an empty message when the dialog is done. Then in the handler create a new AsyncTask as:

    private class MyAsynch extends AsyncTask<String, Void, String>{
        protected void onPreExecute() {
            resetProgress();
            progress.show();
        }
        @Override
        protected String doInBackground(String...strings) { // <== DO NOT TOUCH THE UI VIEW HERE
            // TODO Auto-generated method stub
            doNonUIStuff();
            return someString; // <== return value String result is sent to onPostExecute
        }
        protected void onPostExecute(String result){
            progress.dismiss();
            doSomethingWithString(result); // you could launch results dialog here
        }
    };
 protected void onPause() {
        super.onPause();
        if (asynch != null) {asynch.cancel(true);}
        if (progress != null){progress.cancel();}
    }

    private void resetProgress() {  // avoid frozen progress dialog on soft kill
        if (progress != null && progress.isShowing()){
            progress.cancel();
        }
        progress= new ProgressDialog(this);
        progress.setIndeterminate(true);
        progress.setMessage("I am thinking.");
    }

You could return any type in onPostExecute, in this example I am returning a string. Another approach would be to launch a second Activity as a "dialog" using startActivityForResult create the AsycnTask in onActivityResult.

In other words, gather the data in a dialog or second Activity, then in the first activity show a progress dialog in onPreExecute, do the time intensive task in the background, and cancel the progress dialog in onPostExecute.

I have seen the frozen spinning ball, thus the call to resetProgress().

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜