Android处理程序和可运行的空指针

Android处理程序和可运行的空指针,android,handler,runnable,Android,Handler,Runnable,我有个问题 我正在使用handler和runnable更新我应用程序中的计时器,在runnable中我正在更新textview,1分钟后我想显示一些内容,在我旋转屏幕之前一切正常,现在每个textview都为空,我不知道为什么。 我的代码: 知道为什么会发生这种情况吗?在重新创建活动后,textView为空。对于这种情况,您必须在清单中用活动标记中的指定行指定,然后您的问题将得到解决 i、 e 然后,它将为您的工作旋转屏幕也 编辑答案 最好检查textview是否为空,创建一个引用,然后添加

我有个问题 我正在使用handler和runnable更新我应用程序中的计时器,在runnable中我正在更新textview,1分钟后我想显示一些内容,在我旋转屏幕之前一切正常,现在每个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();