1

I'm trying to make a "loading..." message appear whilst the user is waiting for the reponse from the web service to appear.

I've had a look at a variety of other similar questions/answers and a tutorial I found online but can't quite get it to functioning properly.

Any help would be hugely appreciated!

Code is here:

public class SunriseSunset extends Activity implements OnClickListener {

    public Button getLocation;
    public Button setLocationJapan;
    public TextView LongCoord;
    public TextView LatCoord;
    public double longitude;
    public double latitude;
    public LocationManager lm;
    public Spinner Locationspinner;
    public DateDialogFragment frag;
    public Button date;
    public Calendar now;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sunrisesunset);
        // Show the Up button in the action bar.
                setupActionBar();

        //Setting onClickListener for Calculate Sunrise/Sunset Button
        findViewById(R.id.CalculateSunriseSunset).setOnClickListener(this);

        //Sets up LocationManager to enable GPS data to be accessed.
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1,
                new MyLocationListener());

        //Declares Latitude and Longitude TextViews
        LatCoord = (TextView) findViewById(R.id.LatCoord);
        LongCoord = (TextView) findViewById(R.id.LongCoord);

        //Declares for Location Spinner/Dropdown
        addListenerOnSpinnerItemSelection();

        //Date shit
        now = Calendar.getInstance();
        date = (Button)findViewById(R.id.date_button);
        date.setText(DateFormat.format("dd MMMM yyyy", Calendar.getInstance()));
        date.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog();
            }
        });

    }
    /**
     * Set up the {@link android.app.ActionBar}.
     */
    private void setupActionBar() {

        getActionBar().setDisplayHomeAsUpEnabled(true);

    }

    // More date shit
    @SuppressLint("CommitTransaction")
    public void showDialog() {  
        FragmentTransaction ft = getFragmentManager().beginTransaction(); //get the fragment   
        frag = DateDialogFragment.newInstance(this, new DateDialogFragmentListener(){      

        public void updateChangedDate(int year, int month, int day){                     
        now.set(year, month, day);
        date.setText(DateFormat.format("dd MMMM yyyy", now));             
        }  
          }, now);
        frag.show(ft, "DateDialogFragment");     }



    public interface DateDialogFragmentListener{
        //this interface is a listener between the Date Dialog fragment and the activity to update the buttons date
        public void updateChangedDate(int year, int month, int day);
    }

    public void addListenerOnSpinnerItemSelection() {
        Locationspinner = (Spinner) findViewById(R.id.Locationspinner);
        Locationspinner
                .setOnItemSelectedListener(new CustomOnItemSelectedListener(
                        this));
    }


    protected void showCurrentLocation() {
        // TODO Auto-generated method stub
        // This is called to find current location based on GPS data and sends
        // these values to the LongCoord and LatCoord TextViews
        Location location = lm
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        latitude = location.getLatitude();
        longitude = location.getLongitude();

        LongCoord.setText(Double.toString(longitude));
        LatCoord.setText(Double.toString(latitude));
    }

    @Override
    public void onClick(View arg0) {
        Button b = (Button) findViewById(R.id.CalculateSunriseSunset);
        b.setClickable(false);
        new LongRunningGetIO().execute();
    }

    public class LongRunningGetIO extends AsyncTask<Void, Void, String> {
        //Reads in the web service
        protected String getASCIIContentFromEntity(HttpEntity entity)
                throws IllegalStateException, IOException {
            InputStream in = entity.getContent();
            StringBuffer out = new StringBuffer();
            int n = 1;
            while (n > 0) {
                byte[] b = new byte[4096];
                n = in.read(b);
                if (n > 0)
                    out.append(new String(b, 0, n));
            }
            return out.toString();
        }

        @SuppressLint("SimpleDateFormat")
        @Override
        protected String doInBackground(Void... params) {
            HttpClient httpClient = new DefaultHttpClient();
            HttpContext localContext = new BasicHttpContext();

            // Finds todays date and adds that into the URL in simple date format DD/MM
            SimpleDateFormat df = new SimpleDateFormat("dd/MM");
            String formattedDate = df.format(now.getTime());

            String finalURL = "http://www.earthtools.org/sun/"
                    + LatCoord.getText().toString().trim() + "/"
                    + LongCoord.getText().toString().trim() + "/"
                    + formattedDate + "/99/0";
            HttpGet httpGet = new HttpGet(finalURL);
            String text = null;

            try {
                HttpResponse response = httpClient.execute(httpGet,
                        localContext);
                HttpEntity entity = response.getEntity();
                text = getASCIIContentFromEntity(entity);
            } catch (Exception e) {
                return e.getLocalizedMessage();
            }
            return text;
        }

        protected void onPostExecute(String results) {
            if (results != null) {
                try {

                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                            .newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    InputSource s = new InputSource(new StringReader(results));
                    Document doc = dBuilder.parse(s);
                    doc.getDocumentElement().normalize();
                    TextView tvSunrise = (TextView) findViewById(R.id.Sunrise);
                    TextView tvSunset = (TextView) findViewById(R.id.Sunset);
                    tvSunrise.setText(doc.getElementsByTagName("sunrise").item(0).getTextContent());
                    tvSunset.setText(doc.getElementsByTagName("sunset").item(0).getTextContent());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            Button b = (Button) findViewById(R.id.CalculateSunriseSunset);
            b.setClickable(true);
        }
    }



    class MyLocationListener implements LocationListener {
        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub
        }
    }
}

Any help would be hugely appreciated :) x

Shobhit Puri
  • 25,769
  • 11
  • 95
  • 124
Athoul
  • 61
  • 2
  • 11

2 Answers2

3

Read about AsyncTask, if you haven't read already.

This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.

There are few functions that you can use inside it. Eg: onPreExecute, doInBackground, onProgressUpdate and onPostExecute.

On onPreExecute(), declare a dialog and show a loading... box using this:

private final ProgressDialog dialog = new ProgressDialog(YourClass.this);

protected void onPreExecute() {
   this.dialog.setMessage("loading...");
   this.dialog.show();
}

Then in doInBackground, you can do your task. i.e call the webservice and wait for response( This way you would be waiting in the background thread without locking the UI).

protected Boolean doInBackground(final Void unused) {
  // call your web service here and do other stuff(wait).
  // return true when success else false
}

The above function returns boolean which is accepted as a parameter in the onPostExecute OnpostExecute(), stop the dialog box and show other things like success etc. Something like:

protected void onPostExecute(final Boolean result) {
   if (this.dialog.isShowing()) { // if dialog box showing = true
      this.dialog.dismiss(); // dismiss it
   }
   if (result.booleanValue()) {
      //also show register success dialog
   }
}

Also check this thread. Hope this helps.

Community
  • 1
  • 1
Shobhit Puri
  • 25,769
  • 11
  • 95
  • 124
  • 2
    Plus [onProgressUpdate](http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate%28Progress...%29) if You like to have a progress bar instead of just a static text. – Gustek Apr 16 '13 at 23:36
0

Try showing a progress dialog while you execute you AsyncTask and dismiss the dialog on post execute of your AsyncTask. Moreover:

private ProgressDialog progressDialog;

@Override
    public void onClick(View arg0) {
        Button b = (Button) findViewById(R.id.CalculateSunriseSunset);
        b.setClickable(false);
        progressDialog = ProgressDialog.show(SunriseSunset.this, "Loading",
                "Please wait while fetching data");
        new LongRunningGetIO().execute();
    }

...

protected void onPostExecute(String results) {
progressDialog.dismiss();
                if (results != null) {
                    try {
Thomas Kaliakos
  • 3,274
  • 4
  • 25
  • 39