请求后台任务在Android中多次运行

时间:2016-10-23 12:31:38

标签: java android multithreading android-asynctask android-service

我有一个长时间运行的计算,它将传感器数据作为参数。

获得计算结果后,我想调用一个方法来更新视图。

此计算可能需要一些时间,因此我无法在活动代码中运行它,因为我接收传感器数据,因为UI线程冻结或减慢。

由于我希望每次收到新的传感器数据时都运行此计算,Android会为我提供哪些选项?

我尝试过使用AsyncTask。我将启动AsyncTask以使用新的传感器数据运行计算,并且将在其onPostExecute内调用View的更新方法。

不幸的是,这种方法在动画同步方面产生了问题:AsyncTask可以在下一个之后完成,而View的更新将被过时的信息调用,从而有效地使其动画变得紧张。

我也尝试使用executeOnExecutor运行相同的AsyncTask,将单线程执行器传递给它,但这并没有停止动画抖动。

最后,我尝试在MainActivity中运行带有ResultReceiver回调的IntentService。虽然我能够让它运行,但它只运行一次。 我误解了IntentServices的用途吗?我似乎无法多次运行它(使用一个使用额外参数创建意图并使用它调用startService的方法)。

摘要:我对传感器数据的操作速度很慢。我想在每次获取新传感器数据时在后台运行它,并使用其结果/响应来更新视图。

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

虽然我不确定你使用的是什么类型的动画,但是根据应用程序和代码的结构,很少有选项可能不是更新onPostExecute()中的数据,看看你是否可以在回调中做到这一点动画的方法告诉你动画已经完成,即在asynctask中计算它但更新你的arraylist或你在动画的回调方法中使用的任何东西。其次,如果您对动画完成的时间有一个大概的了解,可以使用计时器应用处理程序,并尝试通过延迟调用动画来匹配这两个操作。类似地,如果UI操作跨越活动,则可以使用广播接收器或接口。

答案 1 :(得分:0)

您的服务就在这里.....

dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;

答案 2 :(得分:0)

您可以实施onProgressUpdate()的{​​{1}}方法,然后在AsyncTask中,您可以致电doInBackground(),以便在publishProgress()

中更新您的用户界面