片段在重新加载时崩溃

Posted

技术标签:

【中文标题】片段在重新加载时崩溃【英文标题】:Fragment crashing on reload 【发布时间】:2014-04-19 20:54:58 【问题描述】:

我的问题是,在第二次重新加载时,我的片段因 NullPointerException 而崩溃。异常导致 FragmentTransaction ft = getFragmentManager().beginTransaction();

LogCat

java.lang.NullPointerException
        at xx.xx.wamomu.ui.MeasurementFragment.refresh(MeasurementFragment.java:344)
        at xx.xx.wamomu.ui.MeasurementFragment$9.run(MeasurementFragment.java:392)
        at java.lang.Thread.run(Thread.java:1019)

在创建片段时,我将作为线程启动一个循环,它正在侦听传入事件。

public void threadloop()

    (new Thread(new Runnable() 

        @Override
        public void run() 
            while (!Thread.interrupted())
                try 
                    Thread.sleep(10000);
                    Log.d("LOOP", "TIMEOUT OVER");

                    if (swtch == 1) 

                       refresh();
                        swtch = 0;
                    
                 catch (InterruptedException e) 
                    // ooops
                
        
    )).start();


使用 refresh() 函数,我正在尝试重新加载实际的片段。我在对话框中使用此方法,在对话框关闭后,刷新工作正常。

public void refresh() 

    Log.e("RESUMED", "OK");
    Thread.interrupted();
    Thread.currentThread().interrupt();
    Log.e("CURRENTTHREADREFRESH", "" + Thread.currentThread());
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        changeFragment = new MeasurementFragment();
        ft.replace(R.id.fl_content_frame, changeFragment);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.commit();



在片段中,第一次刷新正在工作,但第二次似乎使片段崩溃。我在想,也许是循环导致了错误,因此我试图杀死片段,主要是为了杀死循环线程。但循环不会停止。

即使我切换到另一个片段,线程也不会停止。我试图在 onPause() 方法中停止它,但循环继续运行。

@Override
public void onPause() 
    super.onPause();
    Thread.interrupted();
    Thread.currentThread().interrupt();
    Log.e("CURRENTTHREADPAUSE", "" + Thread.currentThread());
    Thread.currentThread().interrupt();
    getActivity().getSupportFragmentManager().popBackStack();

【问题讨论】:

协调封闭线程的状态与封闭片段的状态。当片段循环到 onPause() 或 onStop() 时,您需要保存/停止线程状态 Thread.currentThread() in onPause() 将不是您的 threadLoop 线程;它将是应用程序的 UI 线程,您可能不想试图停止它。 @Tanis.7x 我创建了一个 Thread = 循环;在 threadloop() 中,我做了 loop = new Thread(...)。在 onPause() 和 onStop() 我试图用 loop.interrupt(); 停止线程但如果我切换到另一个片段,它仍然会继续监听事件。第二次重新加载仍然会使片段崩溃。 【参考方案1】:

我解决了我的主要问题,片段崩溃了。 我只需要把

FragmentTransaction ft = getFragmentManager().beginTransaction();

onCreate() 方法中。

问题二,线程不停止的问题仍在发生。

编辑:

无法解决线程问题,因此我切换到 ScheduledExecutorService,该服务在 onPause() 方法中停止。

【讨论】:

那么你需要一个片段事务对象来推送一个片段。但是您的日志并没有解决这里的真正问题。这是一个空指针异常。

以上是关于片段在重新加载时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

避免Android在方向更改时自动重新添加我的片段

重新加载时刷新片段

html 输入类型提交通常在单击时重新加载页面。此片段使输入不重新加载页面以便进行ajax调用

Nuxt:页面重新加载时页面崩溃

当活动中的异步任务完成时如何在片段中重新加载ui?

重新加载数据时 Tableview 崩溃