android:如何每2秒将文本添加到另一个活动的TextView中

android:如何每2秒将文本添加到另一个活动的TextView中,android,Android,我有两个活动,一个是main,另一个是Test 在主活动中,我有一个按钮,当我单击此按钮时,我转到测试活动 在测试活动中,我希望应用程序每隔10秒自动向textview添加一些文本 此文本可以是例如“测试” 因此,每10秒将添加一次“测试” 但是,当我离开活动并转到主要活动时,这个过程将继续发生 例如,如果我在主活动上花费20秒,然后返回测试活动,我将在textview中看到另外两个“测试”字符串 我试着用timertask做这件事,但没有成功 这是测试活动的代码,在主活动中,我只有显示其他活动

我有两个活动,一个是main,另一个是Test

在主活动中,我有一个按钮,当我单击此按钮时,我转到测试活动

在测试活动中,我希望应用程序每隔10秒自动向textview添加一些文本

此文本可以是例如“测试” 因此,每10秒将添加一次“测试” 但是,当我离开活动并转到主要活动时,这个过程将继续发生 例如,如果我在主活动上花费20秒,然后返回测试活动,我将在textview中看到另外两个“测试”字符串

我试着用timertask做这件事,但没有成功

这是测试活动的代码,在主活动中,我只有显示其他活动的按钮

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

提前感谢

如果您想实现一种从后台更新视图的方法,我建议您改用a,使用计时器,可能会定期发送广播,主活动可以使用a访问广播。TimerTask可以在后台服务启动时实现

如果您想在加载测试类时立即更新它,您也可以在服务上实现一个“更新”
BroadcastReceiver
,其功能是发送另一个具有更新值的广播

这样,您就不必担心在活动之间切换时测试活动会暂停(如果这是您的目的的话)

编辑:

这是一个非常好的教程,应该包含您需要的所有内容:


如果您想实现一种从后台更新视图的方法,我建议改为使用,使用计时器可能会定期发送广播,主要活动可以使用。TimerTask可以在后台服务启动时实现

如果您想在加载测试类时立即更新它,您也可以在服务上实现一个“更新”
BroadcastReceiver
,其功能是发送另一个具有更新值的广播

这样,您就不必担心在活动之间切换时测试活动会暂停(如果这是您的目的的话)

编辑:

这是一个非常好的教程,应该包含您需要的所有内容:

如果不知道应用程序在何处崩溃(即引发nullPointerException的代码行),所有答案都不会非常精确

以下是我对你问题的看法:

您可以调用
findviewbyd(R.id.tv1)
。当且仅当您的活动处于活动状态且您的布局确实提供id为tv1的文本视图时,此选项才会返回正确的视图。我假设您的xml布局文件是正确的。我认为它可能需要做一些事情,您可以在计时器之外调用这个方法,而这个计时器与您的应用程序无关。使用
getApplication().findViewById(R.id.tv1)
进行尝试。这将确保findViewById在设置xml布局的正确活动中进行搜索

活动有自己的生命周期,请参阅。这将在以后导致问题,因为您的活动可能会被终止,并且更新过程将失败。正如
John
所指出的,您应该使用服务或AlarmManager。始终确保不要太频繁地唤醒cpu,因为这会导致电池耗尽。

如果不知道应用程序在哪里崩溃(即引发nullPointerException的代码行),所有答案都不会非常精确

以下是我对你问题的看法:

您可以调用
findviewbyd(R.id.tv1)
。当且仅当您的活动处于活动状态且您的布局确实提供id为tv1的文本视图时,此选项才会返回正确的视图。我假设您的xml布局文件是正确的。我认为它可能需要做一些事情,您可以在计时器之外调用这个方法,而这个计时器与您的应用程序无关。使用
getApplication().findViewById(R.id.tv1)
进行尝试。这将确保findViewById在设置xml布局的正确活动中进行搜索


活动有自己的生命周期,请参阅。这将在以后导致问题,因为您的活动可能会被终止,并且更新过程将失败。正如
John
所指出的,您应该使用服务或AlarmManager。始终确保不要太频繁地唤醒cpu,因为这会导致电池耗尽。

是否在您提供的代码段中未看到的某个地方初始化了处理程序?harism,您是对的,但现在它只显示第一个“测试”字符串,而没有显示其他内容…Timer.scheduleAtFixedRate(..)如果你想让它在固定的时间间隔内重复,这可能就是你想要的。只要记住在活动被销毁之前取消它的执行,比如在Activity.ondestory()上。但正如John所指出的,我完全不确定这是否是您所追求的方法。
handler
是否在您提供的代码片段中没有看到的地方初始化?harism,您是对的,但现在它只显示第一个“test”字符串,没有其他任何内容…Timer.scheduleAtFixedRate(…)如果你想让它在固定的时间间隔内重复,这可能就是你想要的。只要记住在活动被销毁之前取消它的执行,比如在Activity.ondestory()上。但是正如John所指出的,我完全不确定这是否是你想要的方法。嗨John谢谢你的回答,你有类似的例子吗?嗨js2,我用一个非常适合你文章的教程更新了我的答案。嗨John谢谢你的回答,你有类似的例子吗?H