2015-01-13 2 views
0

Давайте предположим, что у меня есть activityпроблема с проведением ссылки на диалоговое

public class ClassA extends Activity { 

protected void onCreate(Bundle savedInstanceState) 
{ 
    .... 
} 

в onCreate я создать объект класса, который простирается AsyncTask:

MyAsynctask classB = new MyAsyncTask(ClassA.this); //pass activity-context for dialog 
classB.execute(); 

в onPostExecute из MyAsynctask я хочу показать диалог.

protected void onPostExecute(Void result) { 

    Dialog myCustomDialog = new Dialog(activityContext); 
    ... 
    myCustomDialog.show(); 
} 

Теперь я следующая проблема:

После, например, я повернуть мое устройство новый объект MyAsynctask создается и выполняется. Это нормально, и я хочу этого! Но если диалог из предыдущей ссылки MyAsynctask не закрыт пользователем до тех пор, пока он не повернет устройство, новый диалог будет показан выше старого и, что еще хуже, я пропущу память.

Вопрос:

1) Что такое хороший способ держать правильную ссылку на диалог, так что я могу назвать myCustomDialog.dismiss(), прежде чем я создать новый экземпляр MyAsynctask и, следовательно, новый dialog?

2) Будет ли ссылка myCustomDialog.dismiss() устранить сильную ссылку, чтобы GC мог выполнять свою работу, и я больше не пропускаю память? Или мне нужно установить сильную ссылку на что-то подобное после отклонения диалога: myCustomDialog = null?

Я относительно новым для андроид, и я хочу, чтобы узнать хороший образец того, как достигнуть этого сценария :)

Я признателен за любую помощь.

+0

Привет Майк, делает диалог нужно создавать каждый раз, когда это показано? Когда вы получаете поворот, вы, как правило, получаете oncreate/destroy. Так что если на ondestroy вы вызываете dialog.dismiss(). Он должен удалить все старые ссылки –

ответ

0

В диалоговом окне вы должны иметь переменную уровня класса.

Тогда у вас есть несколько вариантов его обработки. В onResume и/или onDestroy вы можете проверить, не является ли оно нулевым и отклонить его соответствующим образом.

Это зависит от того, как вы хотите, чтобы диалог вел себя. Если появится диалоговое окно, а затем телефон будет звонить, должен ли он отображаться, когда пользователь вернется? Что делать, если Android убил ваше приложение во время телефонного звонка, а затем восстановил его, когда пользователь его закончил?

Также, должен ли диалог «снова появляться» после вращения? В этом случае вы должны переопределить onConfigurationChanged для того, чтобы справиться с этим, тоже:

How to use onConfigurationChanged() and newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE in android 2.3.3

Что касается «утечки» - если вы не возражаете, потребление памяти, пока активность не GC'd , то ссылка на деятельность не является проблемой. Вы можете установить для объекта значение null в течение жизненного цикла активности, если вы действительно заинтересованы.

+0

Итак, вы рекомендуете создавать экземпляр 'Dialog' в своей деятельности и передавать ссылку. И в 'onPostExecute' я его настрою и покажу. Таким образом, у меня есть доступ к действительной ссылке в моей «деятельности», где я могу отклонить диалог в 'onPause' или' onResume'! Другой вопрос - полезно ли создать класс холера для ссылки? Или это не рекомендуется? – MMike

+0

Да о создании. Держатель не нужен. Я сделал это много ... – Jim

+0

Хорошо спасибо ... – MMike

0

Я бы, наверное, сделал что-то вроде этого, его немного длиннее.

Класс A:

private Dialog m_dialog = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //Create the dialog 
} 

@Override 
protected void onDestroy() { 
    m_dialog.dismiss(); 
    m_dialog = null; 
} 

public void showDialog(){ 
    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      if(m_dialog != null) 
       m_dialog.show(); 
     } 
    }); 
} 

public void hideDialog(){ 
    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      if(m_dialog != null) 
       m_dialog.hide(); 
     } 
    }); 
} 

ClassB:

protected void onPostExecute(Void result) { 

    classAReference.showDialog(); 
} 
Смежные вопросы