ləːnə
ləːnə

Reputation: 323

Android progress dialog not closing

I want to show progress dialog in the page layout. I implemented in the following code. Progress Dialog is not closed and it keeps running.When I click an image in the previous page it will navigate to the next layout and I want this layout to show progress dialog before all the data is downloaded from server and show it in the list of the current layout. Progress dialog is displayed and list is displayed in the background but progress dialog keeps on running and it does not get closed. I don't know where i am going wrong. Help please.

ProgressDialog pg;
String[] ar;
public void onCreate(Bundle savedInstanceState) 
{

         super.onCreate(savedInstanceState);
         setContentView(R.layout.filename);
         pg=ProgressDialog.show(this, "ABC", "Downloading .....",true);  

         Thread dt= new Thread(new Runnable() 
        {
            public void run() 
            {
                try
                {
                     String addr=Util.url;
                     URL url = new URL(urlname);
                     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                     urlConnection.setConnectTimeout(5000);             
                     InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                     BufferedReader r = new BufferedReader(new InputStreamReader(in));
                     String x = "";
                     String total = "";
                     int i=0;
                     ArrayList<String> content = new ArrayList();
                     while((x = r.readLine()) != null)
                    {
                        content.add(x);
                    }
                    in.close();
                    r.close();
                    ar= content.toArray(new String[content.size()]);

                }
                catch(Exception e1){
                     handler.sendEmptyMessage(0);
                }

            }

        });

        dt.start();
        try{
            dt.join();

        }catch(Exception e){
            handler.sendEmptyMessage(0);
        }

    try{   
        if(ar[0].toString().trim()!="")
        {
             android.view.Display display1 = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
             TableLayout tbl1 = (TableLayout)findViewById(R.id.tableLayout2);

             TableRow newRow1 = (TableRow) new TableRow(this);
             TextView txt=(TextView) new TextView(this);
             txt.setText("No");
             txt.setGravity(Gravity.LEFT);
             txt.setTextColor(Color.RED);
             txt.setTextSize(18);

             TextView txt1=(TextView) new TextView(this);
             txt1.setText("NAME");
             txt1.setTextColor(Color.RED);
             txt1.setTextSize(18);
             txt1.setGravity(3);

             TextView txt2=(TextView) new TextView(this);
             txt2.setText("DATE");

             txt2.setTextColor(Color.RED);
             txt2.setTextSize(18);
             txt.setGravity(3);

             TextView txt3=(TextView) new TextView(this);
             txt3.setText("VALUE");
             txt3.setTextColor(Color.RED);
             txt3.setTextSize(18);
             txt3.setGravity(Gravity.RIGHT);


             txt.setWidth((int)(display1.getWidth()/4));
             txt1.setWidth((int)(display1.getWidth()/4));
             txt3.setWidth((int)(display1.getWidth()/4)); 
             txt2.setWidth((int)(display1.getWidth()/4));


             newRow1.addView(txt2);
             newRow1.addView(txt);
             newRow1.addView(txt1);
             newRow1.addView(txt3);
             tbl1.addView(newRow1);

            for(int t=0;t<(ar.length);t++)
            {
            android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
            TableLayout tbl = (TableLayout)findViewById(R.id.tableLayout1);
            TableRow newRow = (TableRow) new TableRow(this);
            newRow.setClickable(true);
            TextView tx=(TextView) new TextView(this);
            String temp=ar[t].toString();
            tx.setText(temp);
            tx.setTextColor(Color.WHITE);
            tx.setGravity(Gravity.LEFT);
            tx.setTextSize(15);

            t=t+1;

            TextView tx1=new TextView(this);
            tx1.setText(ar[t].toString());
            tx1.setGravity(Gravity.LEFT);
            tx1.setTextColor(Color.WHITE);
            tx1.setTextSize(15);


            t=t+1;

            TextView tx2=new TextView(this);
            tx2.setText(ar[t].toString());
            tx2.setGravity(Gravity.LEFT);
            tx2.setTextColor(Color.WHITE);
            tx2.setTextSize(15);

            t=t+1;

            TextView tx3=new TextView(this);
            tx3.setText(ar[t].toString());
            tx3.setGravity(Gravity.RIGHT);
            tx3.setTextColor(Color.WHITE);
            tx3.setTextSize(15);

            tx3.setWidth((int)(display.getWidth()/4));
            tx.setWidth((int)(display.getWidth()/4));
            tx1.setWidth((int)(display.getWidth()/4));
            tx2.setWidth((int)(display.getWidth()/4));

            newRow.addView(tx);
            newRow.addView(tx2);
            newRow.addView(tx1);
            newRow.addView(tx3);

             newRow.setId(t);

            tbl.addView(newRow);
            }

        }
    }
    catch(Exception e){
        pg.dismiss();
        handler.sendEmptyMessage(0); 
    }

}
private Handler handler = new Handler() {
    @Override 
          public void handleMessage(Message msg) {

        Toast.makeText(this,"Network not available!.... ", Toast.LENGTH_LONG).show();
}
};

Upvotes: 0

Views: 7140

Answers (7)

ləːnə
ləːnə

Reputation: 323

I finally found the solution. I preferred to go for threads since the data to fetch from the server is huge and need to be dynamically assigned to fields.

Thread thread = new Thread() {

            public void run () {
                 try
                { 
                     pg.show();
                     //long running task
                 }
                catch(){
                }

                handler.post(new Runnable() {
                    @Override
                    public void run() {

                        //code for Update UI  after the long running  task


                        // dismiss the progress dialog on UI thread
                        pg.dismiss();

                    }
                });

            }
        };

        thread.start();

Upvotes: 0

jagmohan
jagmohan

Reputation: 2052

Use an AsyncTask and move all the network related code in doInBackground(). Show the ProgressDialog in onPreExecute() of AsyncTask and hide it in onPostExecute().

public class DownloadTask extends AsyncTask<String, Void, Response> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showProgressDialog(R.string.please_wait);
    }

    @Override
    protected Response doInBackground(String... params) {
            try {
                // Do the network stuff here
            } catch (Exception ex) { 
                // Handle exception
            }
        return result;
    }

    @Override
    protected void onPostExecute(Response result) {
        super.onPostExecute(result);
        hideProgressDialog();
        // Do the response handling here
    }
}    

private void showProgressDialog(int resId) {
    if (progressDialog != null && progressDialog.isShowing()) {
        progressDialog.setMessage(getString(resId));
    } else {
        progressDialog = ProgressDialog.show(this, "", getString(resId), false);
    }
}

private void hideProgressDialog() {
    try {
        if (progressDialog != null && progressDialog.isShowing()) {
             progressDialog.dismiss();
        }
    } catch (Exception ex) {
        Log.e(TAG, ex.getMessage(), ex);
    }
}

Hope it helps.

Upvotes: 1

Dehan Wjiesekara
Dehan Wjiesekara

Reputation: 3182

I have go through your code, your progress dialog will exit if and only if your program throws an exception. put it out side of the catch block(after the catch block) following code

catch(Exception e){
    pg.dismiss();
    handler.sendEmptyMessage(0); 
}

should be changed to

catch(Exception e){
    handler.sendEmptyMessage(0); 
}finally{
    pg.dismiss();
}

if above is not working try to shift the finally block to inside the thread's run method as shown in following..

Thread dt= new Thread(new Runnable() 
    {
        public void run() 
        {
            try
            {
                 String addr=Util.url;
                 URL url = new URL(urlname);
                 HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                 urlConnection.setConnectTimeout(5000);             
                 InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                 BufferedReader r = new BufferedReader(new InputStreamReader(in));
                 String x = "";
                 String total = "";
                 int i=0;
                 ArrayList<String> content = new ArrayList();
                 while((x = r.readLine()) != null)
                {
                    content.add(x);
                }
                in.close();
                r.close();
                ar= content.toArray(new String[content.size()]);

            }
            catch(Exception e1){
                 handler.sendEmptyMessage(0);
            }finally{
                pg.dismiss();
            }

        }

    });

Upvotes: 1

Kalai.G
Kalai.G

Reputation: 1610

try to use AsyncTask http://developer.android.com/reference/android/os/AsyncTask.html

Sample code:

AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {

    @Override
    protected void onPreExecute() {
         //Show UI
         //Start your progress bar

         showProgress();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
         // do your bg process 
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
                      //Show UI
         //dismiss your progress bar
        hideProgress();
    }

};
task.execute((Void[])null);

Show and hide progress dialog code

public void showProgress() {
        progressDialog = ProgressDialog.show(this, "",
                "Loading. Please wait...");
        progressDialog.setCancelable(false);
    }

public void hideProgress() {
    if (progressDialog != null && progressDialog.isShowing()) {
        progressDialog.dismiss();
    }

Upvotes: 1

Erwhyn_khn
Erwhyn_khn

Reputation: 27

replace this :

catch(Exception e){
    pg.dismiss();
    handler.sendEmptyMessage(0); 
}

to this :

catch(Exception e){
    handler.sendEmptyMessage(0); 
}
pg.dismiss();

Upvotes: 1

Nitesh Tiwari
Nitesh Tiwari

Reputation: 4762

You are closing the ProgressDialog on Exception of Try clause

catch(Exception e){
        pg.dismiss();
        handler.sendEmptyMessage(0); 
    }

That's why without Exception this won't close

Upvotes: 1

Sanket Shah
Sanket Shah

Reputation: 4382

Add this line to where ever you want to dismiss your dialog.

if(pg.isShowing())pg.dismiss();

Upvotes: 1

Related Questions