我有一个问题我使用处理器和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();
如果没有初始化处理程序,可能会出现空指针错误。