Android处理程序和runnable nullpointer

时间:2014-05-08 10:13:08

标签: android handler runnable

我有问题 我正在使用处理程序和runnable更新我的应用程序内的计时器,在我的Runnable里面我正在更新textview,1min后我想显示一些内容,一切正常,直到我旋转屏幕,每个textview现在都为null,我无法弄清楚为什么。 我的代码:

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

        test();
            mHandler.postDelayed(this, TIME);
    }
};

为什么会出现这种情况的任何想法?

7 个答案:

答案 0 :(得分:4)

处理程序可能会将Runnable传递给已回收的Activity。正确使用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);
}

答案 1 :(得分:2)

理论上,不应该发生这种(空视图)。

当您更改屏幕方向时,活动将离开屏幕并变得无用,但它仍然存在并引用视图。您的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重新创建活动的唯一情况,所以这样你就不会修复任何错误,只会让它们更难以重现。

答案 2 :(得分:1)

对于此事,您必须在清单中使用活动代码中的指定行进行指定,然后您的问题才会得到解决。

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

    </activity>

然后它也会在你旋转屏幕时起作用。

编辑答案

更好地检查textview如果它为null,则创建一个引用,然后添加数据,它可以解决您的问题。或者您可以从onSavedInstance();

传递旧数据

您可以从onCreate(SavedInstance savedinstance)获取数据

这里它会返回你在onsavedInstance方法中设置的prevoius数据。

尝试使用它来进行数据交换

答案 3 :(得分:0)

旋转后,您的活动会重新创建,因此textView为空。

答案 4 :(得分:0)

请从runnable中删除处理程序代码。首先创建处理程序的对象,然后在您想要的地方编写处理程序后延迟方法。处理程序的主要用途是从线程更新UI。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

 handler = new Handler();

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