【问题标题】:android - MainActivity has leaked windowandroid - MainActivity 已泄漏窗口
【发布时间】:2013-12-23 17:33:04
【问题描述】:

每当我从/向 MainActivity 按下返回时,我都会收到此错误消息。该应用程序不会崩溃,但此消息将显示在 logcat 中。我已经搜索过这个问题,但大多数都与解除对话有关。但我的情况是 MainActivity 上没有显示对话框。

12-06 18:18:24.799  13422-13422/com.zq.x E/WindowManager﹕ android.view.WindowLeaked: Activity com.zq.x.MainActivity has leaked window android.widget.RelativeLayout{42e869e0 I.E..... ......ID 0,0-768,96} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at uk.co.senab.actionbarpulltorefresh.library.PullToRefreshAttacher.addHeaderViewToActivity(PullToRefreshAttacher.java:616)
            at uk.co.senab.actionbarpulltorefresh.library.PullToRefreshAttacher$1.run(PullToRefreshAttacher.java:127)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

activity_main.xml

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

MainActivity.java

...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });

        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
            actionBar.addTab(
                    actionBar.newTab()
                            .setText(mSectionsPagerAdapter.getPageTitle(i))
                            .setTabListener(this));
        }

        session = new SessionManager(getApplicationContext());

        nearbyUsers = new ArrayList<User>();

        if(!session.isValidated()){ 
            session.loginUser();
            finish();
        }else{
            Log.d("MainActivity","Logged in as ["+session.getUserDetails().get(SessionManager.KEY_USR_EMAIL)+"]");

            gps = new GPSTracker(getApplicationContext());
            if(gps.canGetLocation()){
                gps.addListener(this);
                if(!gps.isNetworkEnabled() && gps.isGPSEnabled() && mUpdateLocTask == null){
                    this.locationUpdated();
                }
            }
        }
    }
...

【问题讨论】:

  • 请在onCreate() 方法中发布您的Activity 使用的XML 布局
  • 请也粘贴您的代码...
  • @NitroNbg 我在这里添加了代码和xml。
  • 你用过Relative Layout吗???
  • @PiyushGupta,我在 MainActivity.xml 和附加到此活动的其他片段 xml 中找不到 RelativeLayout。在其他片段中,我使用 LinearLayout 和 PullToRefreshLayout(可能是这个?)。

标签: android android-activity window memory-leaks


【解决方案1】:

我也有这个问题。解决了它,它对我有用。

PullToRefreshLayout(扩展RelativeLayout)类实际上将RelativeLayout动态添加到主Activity。我不明白它的一切。但是,我可以告诉您的一件事是,当用户退出主要活动时,需要销毁 RelativeLayout。

销毁相对布局实际上已经由 PullToRefresh 处理,但在我的情况下有时会失败。我不得不手动销毁 Main Activity 的 onDetachedFromWindow() 中的 RelativeLayout 视图。

我在我的库中修改了 PullToRefreshLayout.java 并添加了:

public void manuallyDetachFromWindow(){
    onDetachedFromWindow();
}

在MainActivity.java中,我添加了以下代码:

public static WeakReference<PullToRefreshLayout> wrefMPullToRefreshLayout;
...

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

    wrefMPullToRefreshLayout = new WeakReference<PullToRefreshLayout>(new PullToRefreshLayout(this));

}

@Override
public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    try{
         MainActivity.wrefMPullToRefreshLayout.get().manuallyDetachFromWindow();
    }catch(NullPointerException e){

    }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多