我正在编写一个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
}
}
答案 0 :(得分:1)
目前还不清楚你要做什么,但是让我说以这种方式使用AsyncTask
可能会产生负面影响。
AsyncTask
在内部使用线程池模式来运行doInBackground()
中的内容。在1.6之前的Android OS上,从3.0开始,池大小只有1,这意味着没有对一堆AsyncTasks进行并行计算。有关此here的详细信息。
因此,这可能导致只有当前AsyncTask
正在运行,而其他人即使启动也必须等待,直到当前的一个完成。
根据您对周期性事情的需求,Android公开:
Activity.runOnUiThread(Runnable action)
内TimerTask
更新:根据您的评论看起来您需要一个Service
,它会启动一个定期发送带有UI数据的广播的线程。然后,您的UI(Activity)注册广播接收器以捕获这些广播,提取数据并用于UI更新。
答案 1 :(得分:0)
所以你说onProgessUpdate()不起作用?这似乎很奇怪,因为它应该。 你拥有的另一个选择就是让一个Thread循环。 诀窍在于,如果要更新UI线程,则必须调用view.post()并为其提供实际执行更新的runnable。这里的想法是你必须在UI线程上安排更新,你不能只是接受并现在说!