我有两个活动,一个是主要的,我还有一个名为Test的活动
在主要活动中,当我点击此按钮时,我有一个按钮,我将进入测试活动
在测试活动中我希望应用程序自动将一些文本附加到textview,它每隔10秒就有一次
这个文字可以是例如“测试” 所以每10秒“测试”将被添加 但是,当我离开活动并进入主要活动时,这个过程将继续发生 所以,如果我在主活动上花了20秒然后返回测试活动,我会在textview中看到另外两个“测试”字符串..
我尝试用timertask做这件事并且根本没有成功
这是Test活动的代码,在主要活动中我只有一个按钮,向我显示其他活动
public class test2 extends Activity {
/** Called when the activity is first created. */
private TimerTask task;
private Handler handler;
private TextView tv;
private Timer t;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.text1);
t = new Timer();
task = new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
TextView tv = (TextView) findViewById(R.id.tv1);
tv.append("test");
}
});
}
};
t.schedule(task, 2000);
}
}
当我点击主要活动的按钮以进入测试活动时,我收到以下错误:
FATAL EXCEPTION: Timer-0
java.lang.NullPointerException
提前致谢
答案 0 :(得分:1)
如果你想实现一种从后台更新视图的方法,我建议切换到使用Service,而定时器可能会定期发送广播,主要活动可以使用{{{ 3}}。 TimerTask可以在后台服务的开始实现。
如果要在加载时立即更新测试类,您可以在服务上实现“更新”BroadcastReceiver
,其功能是发送具有更新值的另一个广播。
这样,您就不必担心在您在活动之间切换时,您的测试活动会暂停(如果这就是您的目的)。
编辑:
这是一个非常好的教程,应该包含您需要的所有内容:
答案 1 :(得分:0)
没有知识应用程序崩溃的地方(即抛出nullPointerException的代码行),所有答案都不是很精确。
以下是我对您的问题的看法:
你致电findViewById(R.id.tv1)
。当且仅当您的活动处于活动状态并且您的布局确实提供标识为tv1
的文本视图时,才会返回正确的视图。我假设你的xml布局文件是正确的。我认为它可能需要做一些你用Timer调用这个方法的东西,它不需要对你的应用程序做任何事情。试试getApplication().findViewById(R.id.tv1)
。这将确保findViewById搜索您设置xml布局的正确活动。
活动有自己的生命周期,请参阅here。这将导致问题,因为您的活动可能会被杀死,更新过程将失败。正如John
指出的那样,Service或AlarmManager是你应该使用的东西。始终确保您不会经常唤醒CPU,因为这会导致电池耗尽。