0

My program is working properly, but in the middle of the program running, user clicks on the BACK button, and the functionality of the back button does not work. But after completing the executing, BACK button functionality is working.

please observe my code here.

package com.sampleexample;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class SampleExample extends Activity {
    static final int PROGRESS_DIALOG = 0;
    Button button;
    TextView download;
    ProgressThread progressThread;
    ProgressDialog progressDialog;

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       Log.d("SampleExample", "======= onCreate()====Start====");
        // Setup the button that starts the progress dialog
        download = (TextView) findViewById(R.id.download);
        button = (Button) findViewById(R.id.progressDialog);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Log.d("SampleExample", "======= onClick()==Start======");
                showDialog(PROGRESS_DIALOG);
                Log.d("SampleExample", "======= onClick()===End=====");
            }
        });
        Log.d("SampleExample", "======= onCreate()====End====");
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // Handle the back button
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            // Ask the user if they want to quit
            Log.d("SampleExample", " ------- Back Button onKeyDown()----Start--");
            new AlertDialog.Builder(this).setIcon(
                    android.R.drawable.ic_dialog_alert).setTitle("Exit")
                    .setMessage("Are you sure you want to leave?")
                    .setNegativeButton(android.R.string.cancel, null)
                    .setPositiveButton(android.R.string.ok,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int which) {
                                    // Exit the activity
                                    SampleExample.this.finish();
                                }
                            }).show();

            // Say that we've consumed the event
            Log.d("SampleExample", " ------BackButton-onKeyDown()----End--");
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

    // Toast.makeText(SampleExample.this, "U have pressed the Back Button",
    // Toast.LENGTH_SHORT).show();

    // Log.d(this.getClass().getName(),
    // "*********back button pressed----------");

    protected Dialog onCreateDialog(int id) {
        Log.d("SampleExample", "99999 onCreateDialog () 999 Start");
        switch (id) {
        case PROGRESS_DIALOG:
            progressDialog = new ProgressDialog(SampleExample.this);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setMessage("Loading...");
            download.setText("Now downloading.......");
            progressThread = new ProgressThread(handler);
            progressThread.start();
            return progressDialog;
        default:
            return null;
        }
    }

    // Define the Handler that receives messages from the thread and update the
    // progress
    final Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            Log.d("SampleExample", "8888 handleMessage () 8888 Start");
            int total = msg.getData().getInt("total");
            progressDialog.setProgress(total);
            if (total >= 100) {
                // Toast.makeText(SampleExample.this, "Download is completed",
                // Toast.LENGTH_SHORT).show();
                download.setText(" download is completed.");
                dismissDialog(PROGRESS_DIALOG);
                progressThread.setState(ProgressThread.STATE_DONE);
            }
        }
    };

    /** Nested class that performs progress calculations (counting) */
    private class ProgressThread extends Thread {
        Handler mHandler;
        final static int STATE_DONE = 0;
        final static int STATE_RUNNING = 1;
        int mState;
        int total;

        ProgressThread(Handler h) {
            mHandler = h;
        }

        public void run() {
            mState = STATE_RUNNING;
            total = 0;
            Log.d("SampleExample", "7777 run () 7777 Start");
            while (mState == STATE_RUNNING) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Log.e("ERROR", "Thread Interrupted");
                }
                Message msg = mHandler.obtainMessage();
                Bundle b = new Bundle();
                b.putInt("total", total);
                msg.setData(b);
                mHandler.sendMessage(msg);

                total++;
            }
            Log.d("SampleExample", "6666 run () 6666 End");
        }

        /*
         * sets the current state for the thread, used to stop the thread
         */
        public void setState(int state) {
            mState = state;
        }
    }
}
Cœur
  • 37,241
  • 25
  • 195
  • 267
chandu
  • 1
  • 1
  • 2

3 Answers3

1

You haven't really explained the symptoms of your problem clearly, but from your code it appears that you are kicking off a background thread and popping up a ProgressDialog. I am assuming that it is while this is running that you are attempting to press the BACK key. The reason that this does not appear to do anything is that a Dialog is by default not cancelable using the BACK key. You have to call setCancelable(true) to enable this behaviour.

    case PROGRESS_DIALOG:
        progressDialog = new ProgressDialog(SampleExample.this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMessage("Loading...");
        progressDialog.setCancelable(true);
        ...
        return progressDialog;

This will allow the ProgressDialog to be cancelled with the BACK button. However your background Thread will continue to run, even if the Dialog has been cancelled.

dave.c
  • 10,910
  • 5
  • 39
  • 62
1
// handle phone back button

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {       
            return quitWithPID();
        }
        return super.onKeyDown(keyCode, event); 
    }

// reusable method (modifier may be public..)
private boolean quitWithPID() {
    new AlertDialog.Builder(this).setIcon(
            android.R.drawable.ic_dialog_alert).setTitle("Exit Boot Options?")
            .setMessage("Are you sure you want to exit?")
            .setNegativeButton(android.R.string.cancel, null)
            .setPositiveButton(android.R.string.ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // Exit the activity
                            MainActivity.this.finish();
                            // Terminate the process ;)
                            android.os.Process.killProcess(android.os.Process.myPid());
                        }
                    }).show();         
    return true;
} 
stealthyninja
  • 10,343
  • 11
  • 51
  • 59
mrhassell
  • 11
  • 1
0

chandu Did you checked your logic before posting the question

Recheck the below code in your handler

if (total >= 100) {

    download.setText(" download is completed.");
    dismissDialog(PROGRESS_DIALOG);
    progressThread.setState(ProgressThread.STATE_DONE);
}

your code won't reach dismissDialog until total >= 100 & hence even whilst the program you are unable to useyour BACK's Action

& also please stop posting multiple questions

Community
  • 1
  • 1
100rabh
  • 6,156
  • 5
  • 27
  • 41