Android 保留对对话框的引用时出现问题
假设我有一个Android 保留对对话框的引用时出现问题,android,memory-leaks,dialog,Android,Memory Leaks,Dialog,假设我有一个活动 public class ClassA extends Activity { protected void onCreate(Bundle savedInstanceState) { .... } 在onCreate中,我创建了一个类的对象,该类扩展了AsyncTask: MyAsynctask classB = new MyAsyncTask(ClassA.this); //pass activity-context for dialog classB.execu
活动
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();
在MyAsynctask
的onPostExecute
中,我想显示一个对话框
protected void onPostExecute(Void result) {
Dialog myCustomDialog = new Dialog(activityContext);
...
myCustomDialog.show();
}
现在我有以下问题:
例如,在旋转设备之后,将创建并执行MyAsynctask
的新对象。那没关系,而且是我想要的方式!但是,如果用户在旋转设备之前未关闭先前引用的MyAsynctask
对话框,则会在旧对话框上方显示一个新对话框,更糟糕的是,我正在泄漏内存
问题:
1)在创建MyAsynctask
的新实例和新的对话框之前,保存对该对话框的有效引用以便调用myCustomDialog.dismise()
的好方法是什么
2)将myCustomDialog.disclose()
清除强引用,以便GC能够完成其工作,并且不再泄漏内存?或者,在取消对话框:myCustomDialog=null
后,是否需要将强引用设置为如下内容
我对安卓系统还比较陌生,我想学习如何完成这个场景的好模式:)
非常感谢您的帮助。您的对话框中应该有一个类级变量
然后你有几个处理它的选项。在onResume
和/或onDestroy
中,您可以检查它是否为空,并相应地将其取消
这取决于您希望对话框的行为方式。如果出现该对话框,然后电话铃响,当用户返回时,该对话框是否仍然可见?如果Android在通话过程中关闭了你的应用程序,然后在用户完成后重新构建它会怎么样
此外,旋转后对话框是否应“重新出现”?在这种情况下,您应该覆盖onConfigurationChanged
,以处理该问题:
至于“泄漏”——如果您不介意内存消耗,只要活动不是GC'd的,那么对活动的引用就不是问题。如果您真的担心,可以在活动生命周期中将对象设置为null。我可能会这样做,这有点冗长
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();
}
});
}
B类:
protected void onPostExecute(Void result) {
classAReference.showDialog();
}
嗨,迈克,每次显示对话框时都需要创建吗?当得到一个轮换时,你倾向于得到一个oncreate/destroy。因此,如果在ondestroy上调用dialog.discouse()。它应该删除所有旧引用,以便您建议在“我的活动”中实例化对话框
,并传递引用。在onPostExecute
中,我自定义并显示它。这样,我就可以访问我的活动中的有效引用
,在那里我可以在onPause
或onResume
中关闭对话框!另一个问题是,创建holer类作为参考是否有用?或者这不是一种推荐的方式?