2012-03-12 47 views
0

我已经实现了Asynctask+orientation change method by CommonsWare即使我使用onCreateDialog和onShowDialog也会漏出窗口

基本上,它的作用是当设备旋转时,活动被破坏。因此,在活动销毁的最后阶段,它将AsyncTask从活动中分离出来,并将其传递给新活动。当创建新活动时,我将AsyncTask附加到新活动。

注意:我没有在清单中使用android:configChanges="orientation,因为我需要不同的肖像和风景布局。

一切工作正常。

众所周知,有一个correct way to display dialogs,我正在使用它。

这工作正常。

问题发生时,当我尝试使用这两种方法在一起。

当我用showDialog(n)调用它时,出现对​​话框。如果我旋转设备一次,一切都很好。但是当我再一次旋转后,logcat日志E/WindowManager(10035): ActivityMainActivity has leaked window [email protected] that was originally added here应用程序不会崩溃。之后,logcat每次旋转设备时都会记录相同的错误,但不会崩溃。

代码(主要活动):

public class MainActivity extends BaseActivity { 

private static final int RATE_US = 1; 
private MainPageAsync task = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    showDialog(RATE_US); 

    task = (MainPageAsync) getLastNonConfigurationInstance(); 

    if (task == null) { 
     task = new MainPageAsync(this); 
     task.execute(super.currentPage); 
    } else { 
     task.attach(this); 
    } 

} 

@Override 
public Object onRetainNonConfigurationInstance() { 

    // remove activity from asynctask 
    if (task != null) 
     task.detach(); 

    return task; 
} 

@Override 
protected Dialog onCreateDialog(int id) { 

    if (id == RATE_US) { 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage("test") 
       .setPositiveButton("Yes", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int id) { 
           //dosomethinghere 
          } 
         }); 
     return builder.create(); 
    } else { 
     return super.onCreateDialog(id); 
    } 
} 

} 

码(的AsyncTask):

public class MainPageAsync extends AsyncTask<String, String, Document> { 

private MainActivity a; 

public MainPageAsync(MainActivity activity) { 
    this.a = activity; 
} 

public void detach() { 
    a = null; 
} 

public void attach(MainActivity activity) { 
    this.a = activity; 
} 


@Override 
protected Document doInBackground(String... params) { 

//network work 

} 

@Override 
protected void onPostExecute(final Document doc) { 

//more work on UI thread 

} 

} 
+0

观察:它看起来像问题连接到我调用'showDialog'的地方。当我在'onCreate'中执行操作时,我一直在旋转时收到泄露的窗口异常,但是当我通过菜单按钮执行操作时,它看起来并不像它产生的异常... – 2012-03-12 16:59:01

回答

-1

DecorView是Android的系统UI - 动作/状态栏。也许这不是你的错。

相关问题