保持对对话框的引用的问题
issue with holding reference to a dialog
假设我有一个 activity
public class ClassA extends Activity {
protected void onCreate(Bundle savedInstanceState)
{
....
}
在 onCreate
我创建了一个 class 的对象,它扩展了 AsyncTask
:
MyAsynctask classB = new MyAsyncTask(ClassA.this); //pass activity-context for dialog
classB.execute();
在 MyAsynctask
的 onPostExecute
中,我想显示一个对话框。
protected void onPostExecute(Void result) {
Dialog myCustomDialog = new Dialog(activityContext);
...
myCustomDialog.show();
}
现在我有以下问题:
例如,在我旋转我的设备后,创建并执行了 MyAsynctask
的新对象。没关系,我想要它的方式!但是,如果之前 MyAsynctask
引用的对话框在用户旋转设备之前没有被用户关闭,则新对话框会显示在旧对话框上方,更糟糕的是我正在泄漏内存。
问题:
1) 保存对对话框的有效引用的好方法是什么,这样我就可以在创建 [=17 的新实例之前调用 myCustomDialog.dismiss()
=] 因此一个新的 dialog
?
2) 会 myCustomDialog.dismiss()
清除强引用以便 GC 能够完成他的工作并且我不再泄漏内存了吗?或者我是否需要在关闭对话框后将强引用设置为类似这样的内容:myCustomDialog = null
?
我对 android 比较陌生,我想学习如何完成这种情况的良好模式:)
感谢任何帮助。
您的对话框应该有一个 class 级别变量。
然后你有几个处理它的选项。在 onResume
and/or onDestroy
中,您可以检查它是否不为 null 并相应地关闭它。
这取决于您希望对话框的行为方式。如果对话框出现然后 phone 响起,当用户 returns 时它是否仍然可见?如果 Android 在 phone 调用期间终止了您的应用程序,然后在用户完成它时重建它怎么办?
另外,旋转后的对话框是否应该"reappear"?在这种情况下,您也应该覆盖 onConfigurationChanged
以处理该问题:
How to use onConfigurationChanged() and newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE in android 2.3.3
至于 "leaking" - 如果您不介意内存消耗,只要 activity 没有被 GC,那么引用 activity 就是不是问题。如果您真的担心,可以在 activity 生命周期期间将对象设置为 null。
我可能会做这样的事情,有点啰嗦。
Class答:
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();
}
假设我有一个 activity
public class ClassA extends Activity {
protected void onCreate(Bundle savedInstanceState)
{
....
}
在 onCreate
我创建了一个 class 的对象,它扩展了 AsyncTask
:
MyAsynctask classB = new MyAsyncTask(ClassA.this); //pass activity-context for dialog
classB.execute();
在 MyAsynctask
的 onPostExecute
中,我想显示一个对话框。
protected void onPostExecute(Void result) {
Dialog myCustomDialog = new Dialog(activityContext);
...
myCustomDialog.show();
}
现在我有以下问题:
例如,在我旋转我的设备后,创建并执行了 MyAsynctask
的新对象。没关系,我想要它的方式!但是,如果之前 MyAsynctask
引用的对话框在用户旋转设备之前没有被用户关闭,则新对话框会显示在旧对话框上方,更糟糕的是我正在泄漏内存。
问题:
1) 保存对对话框的有效引用的好方法是什么,这样我就可以在创建 [=17 的新实例之前调用 myCustomDialog.dismiss()
=] 因此一个新的 dialog
?
2) 会 myCustomDialog.dismiss()
清除强引用以便 GC 能够完成他的工作并且我不再泄漏内存了吗?或者我是否需要在关闭对话框后将强引用设置为类似这样的内容:myCustomDialog = null
?
我对 android 比较陌生,我想学习如何完成这种情况的良好模式:)
感谢任何帮助。
您的对话框应该有一个 class 级别变量。
然后你有几个处理它的选项。在 onResume
and/or onDestroy
中,您可以检查它是否不为 null 并相应地关闭它。
这取决于您希望对话框的行为方式。如果对话框出现然后 phone 响起,当用户 returns 时它是否仍然可见?如果 Android 在 phone 调用期间终止了您的应用程序,然后在用户完成它时重建它怎么办?
另外,旋转后的对话框是否应该"reappear"?在这种情况下,您也应该覆盖 onConfigurationChanged
以处理该问题:
How to use onConfigurationChanged() and newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE in android 2.3.3
至于 "leaking" - 如果您不介意内存消耗,只要 activity 没有被 GC,那么引用 activity 就是不是问题。如果您真的担心,可以在 activity 生命周期期间将对象设置为 null。
我可能会做这样的事情,有点啰嗦。
Class答:
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();
}