在android中实现循环执行?

时间:2012-06-27 20:24:01

标签: android loops real-time executives

我正在编写一个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
    }
}

2 个答案:

答案 0 :(得分:1)

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

AsyncTask在内部使用线程池模式来运行doInBackground()中的内容。在1.6之前的Android OS上,从3.0开始,池大小只有1,这意味着没有对一堆AsyncTasks进行并行计算。有关此here的详细信息。

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

根据您对周期性事情的需求,Android公开:

  • AlarmManager
  • Handler - 它允许在延迟或定期
  • 的UI线程上发布runnable 在Activity.runOnUiThread(Runnable action)
  • Timer + TimerTask

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

答案 1 :(得分:0)

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