ZAJ
ZAJ

Reputation: 835

AlertDialog not working as expected

I am implementing an android app.My problem no wis that when I send the data from the client to the server I want the client to know that the data was sent successfully. I have implemented an AlertDialog but when I send the data,I get a message "Can't create handler inside thread that has not called Looper.prepare()". I have attached my code below.

    private void saveOrder(final Order order) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
            try {
                getConnection().saveOrder(order);
                handleSuccessSaveOrder();
            }
            catch (Exception exc) {
                Log.d("--- ERROR ---", exc.getMessage());
                handleException(exc.getMessage());
            }
        }
    });
    thread.start();
}

private void handleSuccessSaveOrder() {
    showAlert(Farsi.Convert(" j "),R.drawable.warning);
    //showActivity(MainMenuActivity.class);
}

private void showAlert(String message, int iconId) {
    alert = new AlertDialog.Builder(ReviewOrderActivity.this);
    alert.setTitle("Status Dialog");
    alert.setMessage(message);
    alert.setIcon(iconId);

      alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface arg0, int arg1) {
      showActivity(MainMenuActivity.class); } });


    alert.show();

}

Upvotes: 0

Views: 97

Answers (4)

Mohsin Naeem
Mohsin Naeem

Reputation: 12642

you can not change UI from backgroung thread. use like this

private void handleSuccessSaveOrder() {
ReviewOrderActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                showAlert(Farsi.Convert(" j "),R.drawable.warning);

            }
        });

    //showActivity(MainMenuActivity.class);
}

Upvotes: 3

Dipak Keshariya
Dipak Keshariya

Reputation: 22291

Make Handler for display AlertDialog and Try below code instead of your above code, it will solve your problem.

private void saveOrder(final Order order) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                getConnection().saveOrder(order);
                mHandler.sendEmptyMessage(0);
            }
            catch (Exception exc) {
                Log.d("--- ERROR ---", exc.getMessage());
                handleException(exc.getMessage());
            }
        }
    });
    thread.start();
}

public Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        handleSuccessSaveOrder();
    }
};

private void handleSuccessSaveOrder() {
    showAlert(Farsi.Convert(" j "),R.drawable.warning);
}

private void showAlert(String message, int iconId) {
    alert = new AlertDialog.Builder(ReviewOrderActivity.this);
    alert.setTitle("Status Dialog");
    alert.setMessage(message);
    alert.setIcon(iconId);

    alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface arg0, int arg1) {
            showActivity(MainMenuActivity.class); 
        } 
    });

    alert.show();

}

Upvotes: 2

Avadhani Y
Avadhani Y

Reputation: 7646

"Can't create handler inside thread that has not called Looper.prepare()" is due to:

Cannot display the Alert dialog in UI thread while running the process in the background thread.

So, place the alert dialog in UI thread in your handleSuccessSaveOrder() as below:

this.runOnUiThread(new Runnable() {
                    public void run() {
                        showAlert(Farsi.Convert(" j "),R.drawable.warning);
                    }
                });

Upvotes: 1

Nermeen
Nermeen

Reputation: 15973

You cannot modify the ui from a non ui thread, use runOnUiThread:

private void saveOrder(final Order order) {
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
        try {
            getConnection().saveOrder(order);
            runOnUiThread(new Runnable() {
                 public void run() {
                   handleSuccessSaveOrder();
                 }
            });

        }
        catch (Exception exc) {
            Log.d("--- ERROR ---", exc.getMessage());
            handleException(exc.getMessage());
        }
    }
});
thread.start();
}

Upvotes: 4

Related Questions