在 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();
  }
}

您可以实现 AsyncTaskonProgressUpdate() 方法,然后在您的 doInBackground() 中您可以调用 publishProgress() 您可以在 [=10] 中更新您的 UI =]