2

我正在编写一个 android 应用程序,我需要能够定期/连续地做某些事情。我来自 C/C++ 嵌入式固件背景,这种新奇的做事方式需要一些时间来适应。似乎Android中没有“主循环”之类的东西,一切都是事件驱动的……我也明白,默认情况下,你编写的所有代码都在GUI线程上运行,我可能应该创建一个新线程执行相当于“主循环”...

到目前为止,我所拥有的是 AsyncTask 类的实现,它的“doInBackground”方法包含一个无限循环(我的主循环),我创建了这个类的一个实例并在我的应用程序启动时立即运行它。我遇到的问题是在这个线程和用户界面之间的交互......当我的主循环线程中发生某些事情并且我想更新 GUI 时,我知道我必须调用“publishProgress”,它在 GUI 线程上执行. 这有一些问题,主要是我在这个“onProgressUpdate”方法中尝试做的许多事情都不起作用,或者没有在可预测的时间内发生。

我的问题,有没有更好的方法来完成我想做的事情?一般来说,当大多数人在他们的应用程序运行时想要定期和/或连续运行代码时会做什么,这些代码必须及时与用户界面交互(我的意思是及时,零延迟)。

谢谢你。

public class MainLoopThread extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... arg0)
    {
        while(true)
        {
            //Do stuff

            //Update GUI
            publishProgress();
        }   
    }

    protected void onProgressUpdate(Void...voids)
    {
        //Update GUI
    }
}
4

2 回答 2

1

目前尚不清楚您要做什么,但是让我说AsyncTask以这种方式使用可能会产生负面影响。

AsyncTask内部使用线程池模式来运行来自doInBackground(). 在 1.6 之前和从 3.0 开始的 Android OS 上,池大小仅为 1,这意味着一堆 AsyncTask 没有并行计算。更多细节在这里

因此,这可能会导致只有这个当前AsyncTask正在运行,而其他即使启动也必须等到当前运行完成。

根据您对定期完成的事情的需求,Android 会公开:

  • 报警管理器
  • 处理程序 - 它允许延迟或定期在 UI 线程上发布可运行的
  • 定时器+Activity.runOnUiThread(Runnable action)内部TimerTask

更新:根据您的评论,您似乎需要一个Service,它启动一个线程,该线程定期发送带有 UI 数据的广播。然后您的 UI(活动)注册广播接收器以捕获这些广播,提取数据并用于 UI 更新。

于 2012-06-27T21:00:46.650 回答
0

所以你说 onProgessUpdate() 不起作用?这看起来很奇怪,因为它应该。您拥有的另一个选择就是制作一个循环的线程。诀窍是,如果你想更新 UI 线程,你必须调用 view.post() 并给它一个实际执行更新的 runnable。这里的想法是您必须在 UI 线程上安排更新,您不能只是接受它并说现在!

于 2012-06-27T20:31:56.943 回答