Android处理器和可运行的空指针



我有一个问题我使用处理器和runnable来更新定时器在我的应用程序内,在我的runnable我更新textview, 1分钟后我想显示一些内容,一切工作正常,直到我旋转屏幕,每个textview现在是空的,我不知道为什么。我的代码:

Runnable mTimer = new Runnable() {
    @Override
    public void run() {
            textView.setText(DateFormat.format("mm:ss", timers - System.currentTimeMillis()));
        test();
            mHandler.postDelayed(this, TIME);
    }
};

知道为什么会发生这种情况吗?

Handler可能会向被回收的Activity传递一个Runnable。正确使用Handler就像

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);
}

理论上,这种情况不应该发生。

当你改变屏幕的方向,活动离开屏幕,变得无用,但它仍然存在并引用视图。您的runnable引用了创建它的活动的实例,因此当runnable仍然存在时,活动不会死亡。至少是这样。你用的是哪个Android版本?

我似乎明白你的意思了。你指的是视图中的空内容。您必须创建一个静态变量,例如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重新创建Activity的唯一情况,所以这样你不会修复任何错误,你只会使它们更难以复制。

对于这个东西,您必须在您的清单中指定活动标签中的指定行,然后您的问题将得到解决。

。e,

 <activity android:name="your activity" 
           android:configChanges="screenSize|keyboardHidden|orientation">
    </activity>

那么它也会为你旋转屏幕工作。

编辑回答

最好检查textview,如果它是空创建一个引用,然后添加数据,它可能会解决你的问题。或者同时你可以从onSavedInstance();

传递你的旧数据

你可以从onCreate(SavedInstance SavedInstance)

获取数据

这里它将返回你在onsavedInstance方法中设置的先前的数据。

尝试这个数据交换,它将工作

旋转后你的活动重新创建,所以textView是null

请从可运行程序中删除处理程序代码。另外,首先创建处理程序的对象,然后在需要的地方编写处理程序的post delayed方法。处理程序的主要用途是从线程更新UI。

如果Activity在你转动设备时没有崩溃,这意味着textView在那里。如果你在屏幕上看到空,那就是textView的内容被设置为空。在文本中,我看到的唯一变量是计时器。这个变量在哪里定义,在哪里设置?

首先检查您是否正确初始化处理程序,如下所示:

 handler = new Handler();

如果没有初始化处理程序,可能会出现空指针错误。

相关内容

最新更新