Android Alert Dialog isShowing свойство всегда ложно - PullRequest
1 голос
/ 03 марта 2012

У меня есть следующий код, в основном я получаю данные из веб-службы каждые 10 секунд и отображаю то, что получаю каждый раз, в диалоговом окне с предупреждением и уведомлением. Вопрос в том, как не открыть всплывающее предупреждение, если оно не было закрыто по сравнению с предыдущим циклом и все еще находится на странице, поэтому не будет одновременно открыто 2 или более одинаковых оповещения, которые должен закрыть пользователь.

    public class myActivity extends Activity {
public class getActiveAlerts extends Thread {

    public void run() {

        while (true)
        {
        try {
                .... code to get data from web service .....

Кажется, что даже когда AlertDialog присутствует и не затрагивается, когда наступают следующие 10 секунд, даже если старое предупреждение все еще там, «alert.isShowing» все еще показывает false и создает новое предупреждение с тем же свойства каждые 10 секунд. (Я бы подумал, если предупреждение будет открыто, alert.isShowing будет показывать true, а не создавать новое предупреждение. Я здесь что-то не так делаю или есть лучший способ сделать это?

И, наконец, я не верю, что есть способ определить, активно ли в данный момент уведомление / показывается ли оно и пока не закрыто. Существует ли стандартный способ проверки, отображается ли уведомление, когда поток вызывается для повторного запуска через 10 секунд, чтобы уведомление не создавалось каждые 10 секунд?

                            String root = doc.getDocumentElement().getNodeName();
                                //lets set alert title and msg to whatever "root" is for now, root contains the data I get from my web service.

                                myActivity.this.runOnUiThread(new Runnable() {

                                    @Override
                                    public void run() {
                                        AlertDialog.Builder alertBuild = new AlertDialog.Builder(myActivity.this);
                                        alertBuild.setMessage(root)
                                        .setCancelable(false)
                                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int id) {
                                        }
                                        }); 
                                        AlertDialog alert = alertBuild.create();
                                        if(alert.isShowing())
                                        {
                                            Log.v("alert", "isShowing==true"); 
                                        }
                                        else {
                                            Log.v("alert", "isShowing==false");
                                            alert.setTitle(root);
                                            alert.setIcon(R.drawable.ic_launcher);
                                            alert.show();
                                        }
                                    }
                                });
                                displayNotification(root, root);
                            }
                        }
                    }

                }catch (SAXParseException err) {  
                Log.v(" " , err.getMessage ());

                }catch (SAXException e) {
                Exception x = e.getException ();
                ((x == null) ? e : x).printStackTrace ();

                }catch (Throwable t) {
                t.printStackTrace ();
                }
            try {
                Thread.sleep(10000); // sleeps for 10 seconds then runs myActivity again
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }// close while loop
    }
}




/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    getActiveAlerts thread = new getActiveAlerts();
    thread.start();

}

public void displayNotification(String msg, String desMsg)
{
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.ic_launcher, msg + "\n" + desMsg, System.currentTimeMillis());

PendingIntent contentIntent = PendingIntent.getActivity(this, 1, new Intent(this, myActivity.class), 0);

notification.setLatestEventInfo(this, "new alert", "", contentIntent);

manager.notify(1, notification);
}

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Вы каждый раз создаете новый объект AlertDialog. Поскольку вы только что создали его и не вызывали show для этого конкретного объекта, isShowing имеет значение false для этого конкретного объекта. Любые ранее созданные диалоги могут отображаться или не отображаться, но вы не запрашиваете эти объекты.

Вы можете исправить это, вызвав метод вашей деятельности в исполняемом файле с любым результатом, который вы хотите опубликовать, вместо того, чтобы делать публикацию в исполняемом файле. Это позволит деятельности отслеживать текущий отображаемый диалог и не создавать новый, если он уже был виден.

Обратите внимание, что наличие ссылки на вашу активность в фоновом потоке потенциально может привести к большой утечке памяти, если срок жизни вашего потока больше, чем у вашей активности. Подумайте о том, чтобы хранить слабую ссылку на слушателя в вашей ветке, а не жесткую ссылку на вашу деятельность.

1 голос
/ 03 марта 2012

Похоже, что вы вызываете alert.isShowing () после создания нового объекта AlertDialog, который будет иметь значение false до тех пор, пока не будет вызван alert.show ().

...