Rob*_*bin 38 java eclipse android class nullpointerexception
我知道有很多不同的原因,NPE但我的有点奇怪(至少对我而言).
所以我已经将我转换Activities为Fragments成功,但我的问题似乎来自显示日期的函数.当应用程序运行时,一切正常.但是只要按下后退按钮.应用程序强制关闭,然后在日志中它说我正在NullPointerException第102行.所以看看代码,我对此进行了研究但很遗憾没有得到任何结果.
这是按下后退按钮时出现错误的行.
getActivity().runOnUiThread(new Runnable(){
Run Code Online (Sandbox Code Playgroud)
此外,我已经尝试禁用后退按钮(因为我正在构建一个启动器,它不需要).但它似乎没有奏效.
这是整个日期显示方法/功能的代码.
// (Calendar) Date function - Displays dateview on Card
final boolean keepRunning1 = true;
Thread thread_two = new Thread(){
@Override
public void run(){
while(keepRunning1){
// Make the thread wait half a second. If you want...
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Toast.makeText(getActivity().getApplicationContext(), "Default Signature Fail", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
getActivity().runOnUiThread(new Runnable(){
@Override
public void run(){
TextView date = (TextView) getView().findViewById(R.id.date);
date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}
});
}
}
};
thread_two.start();
Run Code Online (Sandbox Code Playgroud)
感谢您的时间,希望您可以了解我做错了什么.
Logcat -
05-23 21:17:33.216: E/AndroidRuntime(6906): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' on a null object reference
05-23 21:17:33.216: E/AndroidRuntime(6906): at com.activelauncher.fragments.UtilsFragment$2.run(UtilsFragment.java:102)
Run Code Online (Sandbox Code Playgroud)
Far*_*uzi 60
我几乎可以肯定,这是在线程完成其工作但活动不再可见时引起的.
您应该检查getActivity()调用是否返回null,并且...
要对代码应用更正,请查看以下内容:
// (Calendar) Date function - Displays dateview on Card
final boolean keepRunning1 = true;
Thread thread_two = new Thread(){
@Override
public void run(){
while(keepRunning1){
// Make the thread wait half a second. If you want...
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Toast.makeText(getActivity().getApplicationContext(), "Default Signature Fail", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
// here you check the value of getActivity() and break up if needed
if(getActivity() == null)
return;
getActivity().runOnUiThread(new Runnable(){
@Override
public void run(){
TextView date = (TextView) getView().findViewById(R.id.date);
date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}
});
}
}
};thread_two.start();
Run Code Online (Sandbox Code Playgroud)
Mar*_*zon 17
按下后,后台线程仍在运行.当线程到达getActivity().runOnUiThread()代码时,活动不再存在.检查活动是否仍然存在如下:
if (getActivity() != null) {
getActivity().runOnUiThread(new Runnable(){
@Override
public void run(){
TextView date = (TextView) getView().findViewById(R.id.date);
date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}
});
}
Run Code Online (Sandbox Code Playgroud)
Apo*_*orv 10
放
if(getActivity() == null)
return;
Run Code Online (Sandbox Code Playgroud)
在getActivity().runOnUiThread(new Runnable(){此之前,当后退按钮关闭且您Thread仍在运行时,它将检查调用是否Activity仍然存在.
如果没有,它会return.
NPE的原因是您的线程未绑定到片段生命周期.片段从其托管活动中分离后,getActivity()返回null.
作为一种解决方案,请考虑完全删除线程,并在UI线程上使用postDelayed()on Handler来发布Runnable在延迟后执行所需更新的s.
试试这个吧
TextView date = (TextView) getView().findViewById(R.id.date);
Run Code Online (Sandbox Code Playgroud)
是日期为空或不检查
if(date !=null){
date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28984 次 |
| 最近记录: |