Android处理程序和可运行的空指针
我有个问题 我正在使用handler和runnable更新我应用程序中的计时器,在runnable中我正在更新textview,1分钟后我想显示一些内容,在我旋转屏幕之前一切正常,现在每个textview都为空,我不知道为什么。 我的代码:Android处理程序和可运行的空指针,android,handler,runnable,Android,Handler,Runnable,我有个问题 我正在使用handler和runnable更新我应用程序中的计时器,在runnable中我正在更新textview,1分钟后我想显示一些内容,在我旋转屏幕之前一切正常,现在每个textview都为空,我不知道为什么。 我的代码: 知道为什么会发生这种情况吗?在重新创建活动后,textView为空。对于这种情况,您必须在清单中用活动标记中的指定行指定,然后您的问题将得到解决 i、 e 然后,它将为您的工作旋转屏幕也 编辑答案 最好检查textview是否为空,创建一个引用,然后添加
知道为什么会发生这种情况吗?在重新创建活动后,textView为空。对于这种情况,您必须在清单中用活动标记中的指定行指定,然后您的问题将得到解决 i、 e
然后,它将为您的工作旋转屏幕也
编辑答案
最好检查textview是否为空,创建一个引用,然后添加数据,这样可以解决您的问题。或者同时您可以从onSavedInstance()传递旧数据
您可以从onCreate(SavedInstance SavedInstance)获取数据
在这里,它将返回您在onsavedInstance方法中设置的上一个数据
在数据交换中尝试此方法,它将起作用理论上,这种情况(空视图)不应该发生
更改屏幕方向时,“活动”将离开屏幕并变得无用,但它仍然存在并引用视图。您的runnable引用了创建它的活动的实例,因此当runnable仍然存在时,该活动不会消亡。至少是这样。你使用哪个安卓版本
看来我明白你的意思了。您的意思是视图中的空内容。您必须创建一个静态变量,例如lastInstance:
class MyActivity extends Activity {
static MyActivity lastInstance;
void onCreate(...) {
...
lastInstance = this;
}
// no need to reference an instance of any Activity, so static
static class MyRunnable implements Runnable {
@Override
public void run() {
lastInstance.textView.setText(DateFormat.format("mm:ss", timers - System.currentTimeMillis()));
lastInstance.test();
mHandler.postDelayed(this, TIME);
}
}
static Runnable mTimer = new MyRunnable();
}
我不推荐android:configChanges=“screenSize | keyboardHidden | orientation”,因为这不是android重新创建活动时的唯一情况,因此这种方式不会修复任何错误,只会使它们更难复制。请从可运行程序中删除处理程序代码。另外,首先创建handler的对象,然后在需要的地方编写handlers post delayed方法。处理程序的主要用途是从线程更新UI。处理程序可能会向回收的活动提供可运行的。正确使用
处理程序
如下
private Handler mHandler;
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
setContentView(R.layout.yourView);
mTextView = findViewById(R.id.text);
}
@Override
protected void onStart() {
super.onStart();
//start updating every time Activity is started
handler.postDelayed(mTimer, oneMinuteDelay);
}
@Override
protected void onStop() {
super.onStop();
//make sure to remove all messages
handler.removeCallbacksAndMessages(null);
}
如果在您打开设备时活动没有崩溃,则表示textView在那里。如果在屏幕上看到空值,则设置为空值的是textView的内容。 在文本中,我看到的唯一变量是计时器。
此变量在何处定义,在何处设置?首先检查是否正确初始化处理程序,如下所示:
handler = new Handler();
如果不初始化处理程序,可能会出现空指针错误。我知道,但我仍然能够以正常方式使用该控件,它只在尝试从Runnable更新时发生。仍然会崩溃,有趣的是当我将textView放入if(textView!=null)中时我不这么认为,因为它将保持活动的先前状态。我修改了答案,请检查当你旋转视图时,视图是否被破坏和重新创建。你需要处理这个问题。
private Handler mHandler;
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new Handler();
setContentView(R.layout.yourView);
mTextView = findViewById(R.id.text);
}
@Override
protected void onStart() {
super.onStart();
//start updating every time Activity is started
handler.postDelayed(mTimer, oneMinuteDelay);
}
@Override
protected void onStop() {
super.onStop();
//make sure to remove all messages
handler.removeCallbacksAndMessages(null);
}
handler = new Handler();