我有问题 我正在使用处理程序和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);
}
};
为什么会出现这种情况的任何想法?
答案 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();
如果不初始化处理程序,则可能会出现空指针错误。