更新线程中的UI活动

时间:2011-10-05 10:34:46

标签: android multithreading android-activity

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

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很新 非常感谢 - 已经提前了。

2 个答案:

答案 0 :(得分:1)

调用timer#run()就可以了,调用UI线程中的#run()方法。您需要通过调用#start()来启动您的线程 - 然后新线程将执行您期望的操作。

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

不过,请考虑使用AsyncTask。

BR, 延

答案 1 :(得分:0)

请记住,可以更新UI的唯一线程是UIThread

因此,如果您想在另一个线程中修改UI,则应采用以下方法:runOnUIThread()

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