2011-10-05 51 views
2

这是我的问题。我正在编写一个android应用程序,它需要显示它正在运行的活动的时间。为此,我创建了一个新的线程,该线程从活动中调用。但是,当我在模拟器中启动应用程序时,似乎Activity从不加载。也许你们可以在这里帮助我。这里是相关的代码:以线程更新UI活动

public class ActivityStartTracker extends ActivityBasic { 
    TimerThread timer; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.start); 
     timer = new TimerThread(); 
    } 

    protected void onResume() { 
     super.onResume(); 
     registerReceiver(broadcastReceiver, new IntentFilter(
       ServiceLocator.BROADCAST_ACTION)); 
     timer.run(); 
    } 

    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(broadcastReceiver); 
     if (timer.isRunning()) { 
      timer.interrupt(); 
     } 
    } 

    class TimerThread extends Thread { 
     boolean isRunning = false; 

     public TimerThread() { 
     } 

     @Override 
     public void run() { 
      int seconds = 0; 
      isRunning = true; 
      while (isRunning) { 
       try { 
        Log.d(TAG, "Timer is running for : " + seconds); 
        seconds++; 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        isRunning = false; 
       } 
      } 
     } 

     public boolean isRunning() { 
      return isRunning; 
     } 
    } 
} 

就像我说的,这些是相关的代码片段。 问题是,如果我运行这个,活动保持黑色 - 我只是得到与应用程序的名称头,这就是所有。通过日志记录,我可以确认线程正在运行,但没有其他显示。

你可以请我帮忙,我对android比较陌生。
非常感谢 - 已经提前。

+1

hy!我没有看到你更改gui的代码?我想要在线程中更新gui,您必须使用'runOnUIThread()' – test123123

+0

那是真的 - 在我尝试添加显示定时器的新功能之前,GUI工作正常 - 因此我想我可以删除所有findView()和setText()方法。我只是想展示问题的核心 - 所以你们不必读取所有不必要的代码行。 – Daniel

回答

0

保持你记住,可以更新UI的唯一线程是UIThread

所以,如果你想修改另一个线程的UI,你应该方法:runOnUIThread()

,但是当你有一个线程,将更新UI,最好的办法是使用AsyncTask;请参考this

1

调用计时器#run()会做到这一点,调用UI线程中的#run()方法。你需要通过调用#start()来启动你的线程 - 然后新线程将做你的期望。

进一步:永远不要调用Thread#start()两次,它实际上不会重新启动线程,只会导致应用程序崩溃。如果你打算从你的onResume开始线程,你需要在那里分配一个新的线程。

顺便说一句,考虑使用AsyncTask代替。

BR, 延

+0

我也想到了AsyncTask,但是它是用来显示活动正在运行的秒数,我无法弄清楚如何使AsynTask在while() - loop循环中运行,然后将它休眠一秒钟。顺便说一句...感谢您的快速帮助 - 它的工作原理。 – Daniel

+0

处理程序适用于定时器。 http://developer.android.com/reference/android/os/Handler.html – Pramod