在 Android 中多次向 运行 请求后台任务
Requesting a background task to run multiple times in Android
我有一个很长的 运行ning 计算,它将传感器数据作为参数。
得到计算结果后,我想调用一个方法来更新视图
此计算可能需要一些时间,因此我无法在 Activity 代码中 运行 接收传感器数据,因为 UI 线程冻结或变慢。
既然我想在每次收到新的传感器数据时都运行这个计算,Android 给我提供了哪些选项?
我试过使用 AsyncTask。我将启动一个 AsyncTask 以 运行 使用新的传感器数据进行计算,然后将在其 onPostExecute
.
中调用 View 的更新方法
不幸的是,这种方法会导致动画同步问题:AsyncTask 可能会在下一个之后完成,并且 View 的更新会使用 过时的 信息进行调用,从而有效地使其动画变得不稳定。
我也尝试过 运行使用 executeOnExecutor
使用相同的 AsyncTask,将单线程执行器传递给它,但这并没有阻止动画抖动。
最后,我尝试在 MainActivity 中 运行 一个带有 ResultReceiver 回调的 IntentService。虽然我能够 运行ning 得到它,但它只有 运行s 一次。
我是否误解了 IntentServices 的用途?我似乎无法多次 运行 它(使用一种创建带有额外参数的意图并用它调用 startService
的方法)。
总结:我有一个对传感器数据进行操作的慢速方法。每次我获取新的传感器数据时,我都想在后台 运行 它,并使用它 result/response 更新视图。
有什么建议吗?
虽然我不确定你使用的是哪种动画,但取决于你的应用程序和代码的结构,很少有选项可以这样而不是在 onPostExecute() 中更新数据,看看你是否可以做到在动画的回调方法中告诉你动画已经完成,即在 asynctask 中计算它但更新你的 arraylist 或你在动画的回调方法中使用的任何东西。其次,如果您大致了解动画需要多长时间才能完成,您可以应用带有计时器的处理程序,并尝试通过延迟调用动画来匹配这两个操作。同样,如果 UI 操作跨活动,您可以使用广播接收器或接口。
您的服务就在这里.....
public class One extends Service {
public static final long NOTIFY_INTERVAL = 10 * 1000;
private Handler handler = new Handler();
private Timer timer = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate()
{
if (timer != null)
{
timer.cancel();
} else
{
timer = new Timer();
}
timer.scheduleAtFixedRate(new DisplayTime(), 0, NOTIFY_INTERVAL);
}
class DisplayTime extends TimerTask
{
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
recall();
Toast.makeText(getApplicationContext(), "run", Toast.LENGTH_SHORT).show();
}
});
}
public void recall() {
// Write here Async Task Method......
}
}
@Override
public void onDestroy()
{
super.onDestroy();
Toast.makeText(getApplicationContext(), "des", Toast.LENGTH_SHORT).show();
}
}
您可以实现 AsyncTask
的 onProgressUpdate()
方法,然后在您的 doInBackground()
中您可以调用 publishProgress()
您可以在 [=10] 中更新您的 UI =]
我有一个很长的 运行ning 计算,它将传感器数据作为参数。
得到计算结果后,我想调用一个方法来更新视图
此计算可能需要一些时间,因此我无法在 Activity 代码中 运行 接收传感器数据,因为 UI 线程冻结或变慢。
既然我想在每次收到新的传感器数据时都运行这个计算,Android 给我提供了哪些选项?
我试过使用 AsyncTask。我将启动一个 AsyncTask 以 运行 使用新的传感器数据进行计算,然后将在其 onPostExecute
.
不幸的是,这种方法会导致动画同步问题:AsyncTask 可能会在下一个之后完成,并且 View 的更新会使用 过时的 信息进行调用,从而有效地使其动画变得不稳定。
我也尝试过 运行使用 executeOnExecutor
使用相同的 AsyncTask,将单线程执行器传递给它,但这并没有阻止动画抖动。
最后,我尝试在 MainActivity 中 运行 一个带有 ResultReceiver 回调的 IntentService。虽然我能够 运行ning 得到它,但它只有 运行s 一次。
我是否误解了 IntentServices 的用途?我似乎无法多次 运行 它(使用一种创建带有额外参数的意图并用它调用 startService
的方法)。
总结:我有一个对传感器数据进行操作的慢速方法。每次我获取新的传感器数据时,我都想在后台 运行 它,并使用它 result/response 更新视图。
有什么建议吗?
虽然我不确定你使用的是哪种动画,但取决于你的应用程序和代码的结构,很少有选项可以这样而不是在 onPostExecute() 中更新数据,看看你是否可以做到在动画的回调方法中告诉你动画已经完成,即在 asynctask 中计算它但更新你的 arraylist 或你在动画的回调方法中使用的任何东西。其次,如果您大致了解动画需要多长时间才能完成,您可以应用带有计时器的处理程序,并尝试通过延迟调用动画来匹配这两个操作。同样,如果 UI 操作跨活动,您可以使用广播接收器或接口。
您的服务就在这里.....
public class One extends Service {
public static final long NOTIFY_INTERVAL = 10 * 1000;
private Handler handler = new Handler();
private Timer timer = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate()
{
if (timer != null)
{
timer.cancel();
} else
{
timer = new Timer();
}
timer.scheduleAtFixedRate(new DisplayTime(), 0, NOTIFY_INTERVAL);
}
class DisplayTime extends TimerTask
{
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
recall();
Toast.makeText(getApplicationContext(), "run", Toast.LENGTH_SHORT).show();
}
});
}
public void recall() {
// Write here Async Task Method......
}
}
@Override
public void onDestroy()
{
super.onDestroy();
Toast.makeText(getApplicationContext(), "des", Toast.LENGTH_SHORT).show();
}
}
您可以实现 AsyncTask
的 onProgressUpdate()
方法,然后在您的 doInBackground()
中您可以调用 publishProgress()
您可以在 [=10] 中更新您的 UI =]