【发布时间】: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()inonPause()将不是您的threadLoop线程;它将是应用程序的 UI 线程,您可能不想试图停止它。 -
@Tanis.7x 我创建了一个 Thread = 循环;在 threadloop() 中,我做了 loop = new Thread(...)。在 onPause() 和 onStop() 我试图用 loop.interrupt(); 停止线程但如果我切换到另一个片段,它仍然会继续监听事件。第二次重新加载仍然会使片段崩溃。
标签: android multithreading nullpointerexception fragment