Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
254 views
in Technique[技术] by (71.8m points)

android - progress bar remains empty using asynctask - EDIT - dialog never stops loading

I want to have a progress bar while waiting for GPS signal to establish.

I use:

public class GetGPSData extends AsyncTask<Void, Integer, Void> {
               @Override
               protected void onPreExecute() {
                   //super.onPreExecute();
                   myprogressBar.setVisibility(View.VISIBLE);
                   myprogressBar.setProgress(0);

               }

               @Override
               protected void onProgressUpdate(Integer... progress) {
                   //super.onProgressUpdate(progress);
                   myprogressBar.setProgress(progress[0]);

               }

               @Override
               protected Void doInBackground(Void... params) {

               latitude = gps.getLatitude();
               longitude = gps.getLongitude();

               while (latitude == 0 || longitude ==0)
               {

                   try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  
               }
                return null;
               }

                  protected void onCancelled() {
                      Toast.makeText(getBaseContext(), "Error connecting", Toast.LENGTH_LONG).show();

                  }

               @Override
               protected void onPostExecute(Void result) {
                   super.onPostExecute(result);
                   myprogressBar.setProgress(100);

               Toast.makeText(getBaseContext(), "Your Location is  
Lat: " + latitude + "
Long: " + longitude, Toast.LENGTH_LONG).show();

               }
           }

and:

 <ProgressBar android:id="@+id/myprogressBar"
  style="?android:attr/progressBarStyleHorizontal" 
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" 
  android:layout_alignParentLeft="true"
  android:indeterminate="true"
  android:layout_below="@+id/comments"
  android:padding="5dp" />

But the progress bar remains empty.

Also,when I click the button in order to start getting the GPS signal, the GPS flashes ,then stop flashing ( but in the meanwhile it still searches for signal ) and when I press it again it gives me the Toast message I have in onPostExecute.Is this normal behavior?

Shouldn't the icon be flashing until finds the signal and then show me the message without the user having to press again the button?

--------------------------------UPDATE----------------------------------------------------

I also tried with ProgressDialog :

public class GetGPSData extends AsyncTask<Void, Integer, Void> {
               ProgressDialog progressDialog = null;               

               @Override
               protected void onPreExecute() {
                  super.onPreExecute();



                   progressDialog = new ProgressDialog(ShowList.this);
                   progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                        @Override
                        public void onCancel(DialogInterface dialog) {
                            GetGPSData.this.cancel(true);
                        }

                    });
                   progressDialog.setMessage("Waiting for location...");
                   progressDialog.setIndeterminate(true);
                   progressDialog.setCancelable(true);
                   progressDialog.show();


               }

               @Override
               protected void onProgressUpdate(Integer... progress) {
                   super.onProgressUpdate(progress);


               }

               @Override
               protected Void doInBackground(Void... params) {

                   latitude = gps.getLatitude();
                   longitude = gps.getLongitude();


              while  (latitude == 0 || longitude == 0)
               {
                   try {               
                    Thread.sleep(1000);     

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  

               }


                return null;
               }

                  protected void onCancelled() {
                      Toast.makeText(getBaseContext(), "Cancelled/Error connecting", Toast.LENGTH_LONG).show();
                      progressDialog.dismiss();
                  }

               @Override
               protected void onPostExecute(Void result) {

                   progressDialog.dismiss();

 Toast.makeText(ShowList.this, "Your Location is  
Lat: " + latitude + "
Long: " + longitude, Toast.LENGTH_LONG).show();

               }
           }

but now the progress dialog never stops loading.If I press back button and then again the button to get location ,then it gives me the toast message (with location).

-------------------SOLUTION------------------------------

The problem was (after correcting the while loop) that you must put this.location=location

 public void onLocationChanged(Location location) {
        this.location=location;
    }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Use publishProgress in your doInBackground method

But in your case, you shouldn't use a horizontal ProgressBar with value because you couldn't know when your longitude and latitude are known, just use a simple ProgressBar.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...