繁体   English   中英

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

[英]Requesting a background task to run multiple times in Android

我进行了长时间的计算,以传感器数据作为参数。

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

此计算可能需要一些时间,因此,由于UI线程冻结或变慢,因此在接收传感器数据时,无法在“活动”代码中运行该计算。

由于我想在每次收到新的传感器数据时都运行此计算,因此Android为我提供了哪些选择?

我已经尝试使用AsyncTask 我将启动AsyncTask以使用新的传感器数据运行计算,然后在其onPostExecute内调用View的update方法。

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

我还尝试过通过executeOnExecutor运行相同的AsyncTask,将单线程执行器传递给它,但这并没有阻止动画抖动。

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

摘要 :我有一个处理传感器数据的慢方法。 我想在每次获取新的传感器数据时在后台运行它,并使用其结果/响应来更新视图。

有什么建议么?

尽管我不确定您使用的是哪种动画,具体取决于应用程序和代码的结构,但很少有其他选择,而不是在onPostExecute()中更新数据,请查看是否可以在动画的回调方法中进行操作它告诉您动画已完成,即在asynctask中计算动画,但更新您的arraylist或您在animation的回调方法中使用的内容。 其次,如果您对动画需要多少时间有一个大致的了解,则可以应用带有计时器的处理程序,并通过延迟调用动画来尝试匹配两个操作。 同样,如果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()您可以在onProgressUpdate()更新UI

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM