Android - 刷新活动

时间:2014-07-16 13:58:27

标签: android android-activity refresh

我的Android应用程序有2个活动:

在第一个(MainActivity)中,用户选择一些参数,并将这些参数发送到第二个活动(显示)。 第二个活动调用Web服务,并根据所选参数,Web服务返回一个值。我使用返回的值绘制该值演变的条形图。这就是我在onCreate()函数中放入的第二个活动中创建一个计时器的原因:

Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() { 
    public void run() {
        finish();
        startActivity(getIntent());
    }
},10000, 10000);

因此,每隔10秒钟,第二个活动再次被调用,条形图将使用新返回的值进行更新。

问题是,在计时器的第二次或第三次执行之后,同时返回几个相同的值,就像多次调用该活动一样。然后应用程序开始冻结(但不会关闭)。

我正在使用此库提供的图表:http://android-graphview.org/
我也尝试使用上面网站上提供的函数(resetData和appendData),以及invalidate()函数,但没有任何作用。
为什么会这样?我刷新活动的方式错了吗?

2 个答案:

答案 0 :(得分:0)

你描述它的方式:

  1. 每次调用第二个活动时都会创建一个新的计时器(参见2.)
  2. 每个Timer的目的是每10秒调用第二个活动(参见1.)
  3. 因此,第二个活动作为时间函数被调用的次数呈指数增长。

    一种可能的解决方案是将计时器移动到主活动的onCreate方法(并仍然从中调用第二个活动)。 这样,任何时候都应该只有一个Timer处于活动状态。

    编辑: 正如Marius评论的那样,活动可能不是最佳选择。如果没有用户输入,并且活动所做的唯一事情是调用webservice并返回结果,那么从Main Activity调用的方法就足够了。

答案 1 :(得分:0)

首先,致电finish()并开始活动,不是一个好主意

其次,据我了解您的情况,每隔10秒钟在AsyncTask内调用Timer是实现此目的的更好方法。通过doInBackground()调用您的网络服务,然后从onPostExecute()更新您的用户界面,这样您就可以避免拨打finish()并每隔10秒重新启动您的活动。

最后,您正在创建一个新的Timer实例eveytime,您的Activity将被调用,因此会创建大量Timer个实例来挂起您的应用程序。