假设我有一个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();
<{1>} 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
?
我对android很新,我想学习如何完成这个场景的好模式:)
我感谢任何帮助。
答案 0 :(得分:0)
您的对话框应该有一个类级变量。
然后你有几个处理它的选项。在onResume
和/或onDestroy
中,您可以检查它是否为空,并相应地将其解除。
这取决于您希望对话框的行为方式。如果对话框出现然后电话响了,用户返回时是否仍然可以看到?如果Android在通话过程中杀死了您的应用,然后在用户完成后重新构建了该怎么办?
此外,如果对话框重新出现&#34;轮换后?在这种情况下,你应该覆盖onConfigurationChanged
以便处理它:
至于&#34;泄漏&#34; - 只要活动不是GC,你就不会记住内存消耗,那么引用活动不是问题。如果您真的担心,可以在活动生命周期中将对象设置为null。
答案 1 :(得分: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();
}