Как я могу определить, находится ли Activity в пригодном для использования состоянии из Runnable? - PullRequest
0 голосов
/ 21 марта 2011

У меня есть служба, которая выполняет обновление данных. У меня есть активность, которая присоединяет слушателя к службе (через локальную привязку). Слушатель получает обновления прогресса. После получения обновления хода выполнения он планирует запуск в потоке пользовательского интерфейса. Вот код ( обновлен для отображения полного списка ):

public class MyActivity extends Activity {

  static final int UPDATE_DIALOG = 0;
  ProgressDialog updateDialog;

  private TaskService taskService;

  private ServiceConnection taskServiceConnection = new ServiceConnection() {

    private final TaskServiceObserver taskServiceObserver = new TaskServiceObserver() {

      public void updateProgress(final int progress, final int total) {
        runOnUiThread(new Runnable() {
          public void run() {          
            if (updateDialog == null || !updateDialog.isShowing()) {
              showDialog(UPDATE_DIALOG);
            }
            updateDialog.setProgress(progress);
          }
        });
      }

      public void updateCompleted() {
        runOnUiThread(new Runnable() {
          public void run() {  
            dismissDialog(UPDATE_DIALOG);
            startNextActivity();
          }
        });
      }
    };

    public void onServiceConnected(ComponentName name, IBinder binder) {
      taskService = ((LocalBinder) binder).getService();

      taskService.addObserver(taskServiceObserver);
    }

    public void onServiceDisconnected(ComponentName name) {
      taskService.removeObserver(taskServiceObserver);
      taskService = null;
    }

  };

  protected void onStart() {
    super.onStart();

    Intent intent = new Intent(this, TaskService.class);
    startService(intent);
    bindService(intent, taskServiceConnection, Context.BIND_AUTO_CREATE);
  }

  protected void onStop() {
    super.onStop();

    if (taskService != null) {
      unbindService(taskServiceConnection);
    }
  }

  protected Dialog onCreateDialog(int id) {
    switch (id) {
    case UPDATE_DIALOG:
      updateDialog = new ProgressDialog(this);
      updateDialog.setTitle("My App");
      updateDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
      updateDialog.setMessage("Preparing to run for the first time...");
      return updateDialog;
    default:
      return null;
    }
  }

}

Если я нажму кнопку «Домой» во время отображения диалогового окна, а затем вернусь к приложению, произойдет сбой в строке showDialog. С помощью отладчика я смог определить, что действие находится в завершенном состоянии.

Какую проверку можно поставить в моем работающем файле, чтобы определить, безопасно ли вызывать showDialog?

Ответы [ 3 ]

0 голосов
/ 21 марта 2011

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

0 голосов
/ 22 марта 2011

Решение, с которым я в итоге поехал, состояло в том, чтобы создать флаг taskServiceBound, который был установлен в true после привязки к сервису в onStart и установлен в false перед отменой привязки из сервиса в onStop. Поскольку флаг обновляется в потоке пользовательского интерфейса, я могу использовать его для установки Runnables в updateProgress и updateCompleted. Например:

  public void updateCompleted() {
    runOnUiThread(new Runnable() {
      public void run() {  
        if (taskServiceBound) {
          dismissDialog(UPDATE_DIALOG);
          startNextActivity();
        }
      }
    });
  }
0 голосов
/ 21 марта 2011

Я бы лично закрыл диалоговое окно прогресса, когда действие переходит в режим паузы (переопределение onPause), и при необходимости воссоздаю его при возобновлении действия (переопределение onResume).Возможно, вы теряете память, сохраняя ссылки на свою деятельность в других отдельных объектах (ваш диалог)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...