2012-01-10 17 views
1

我有两个活动,一个是主要的,我有一个名为测试以及的android:如何将文本追加到TextView的另一个动作每2秒

在主要活动我有一个按钮,当我点击另一个活动这个按钮我去测试活动

在测试活动我想申请到一些文本自动追加到TextView的,它具有每10秒

这段文字可以是例如“测试” 所以每10秒“测试”将被添加 但是,当我离开活动并去到主要活动,这个过程将继续发生 因此,如果例如我花了20秒的主要活动,然后返回到测试活动,我会在文本视图中看到两个更多的“测试”字符串..

I试图与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 

在此先感谢

+0

''处理程序'初始化在你提供的代码片段中没有看到的地方吗? – harism 2012-01-10 23:08:26

+0

哈里斯,你是对的,但现在它只是显示第一个“测试”字符串,没有别的... – js2 2012-01-10 23:14:32

+0

Timer.scheduleAtFixedRate(..)也许你正在寻找如果你想让它重复固定间隔。请记住,在Activity被销毁之前取消它的执行,比如Activity.onDestroy()。但正如约翰指出的那样,我不确定这是否是一种你以后的做法。 – harism 2012-01-10 23:21:07

回答

1

如果你想实现从后台更新视图的方式,我建议切换到使用Service而是用定时器可能周期性地发送广播,其中主活动可以通过BroadcastReceiver访问。 TimerTask可以在后台服务开始时执行。

如果您想要在加载时立即更新测试类,则可以在该服务上实现“更新”BroadcastReceiver,其功能是使用更新后的值发送另一个广播。

这样,当您在活动之间切换时(如果这就是您要做的),您无需担心测试活动暂停。

编辑:

这里是应该有你需要的一切一个很好的教程:

http://www.vogella.de/articles/AndroidServices/article.html

+0

嗨约翰谢谢你的答案,你有任何类似的事情吗? – js2 2012-01-10 23:23:02

+0

嗨js2,我用适合你的帖子的教程更新了我的答案。 – 2012-01-10 23:35:01

+0

+1在这种情况下,服务是最合理的方法IMO。 – yorkw 2012-01-10 23:54:54

0

不知情其中应用程序崩溃(的代码,其中即行抛出nullPointerException)所有的答案都不是很精确。

这就是我想你的问题:

你打电话findViewById(R.id.tv1)。当且仅当您的活动处于活动状态并且您的布局确实提供了一个ID为tv1的文本视图时,才会返回正确的视图。我假设你的xml布局文件是正确的。我认为它可能不得不做一些你从定时器中调用这个方法的东西,它不需要对你的应用程序做任何事情。试用getApplication().findViewById(R.id.tv1)。这将确保findViewById在您设置xml布局的正确活动中进行搜索。

活动有其自己的生命周期,请参见here。这会导致问题,因为您的活动可能会被杀死,更新过程将失败。正如John指出的那样,Service或AlarmManager是你应该使用的东西。请务必确保不要经常唤醒CPU,否则会导致电池电量耗尽。

相关问题