服务中的Xamarin.Android计时器

时间:2018-02-13 01:33:16

标签: xamarin xamarin.android

我有一个简单的服务,这项服务的工作是每分钟运行并获得用户的当前位置。我的代码不会每分钟重复一次。

我的Time CallBack中出现以下错误

Java.Lang.RuntimeException:超时获取异常详细信息  无法在未调用Looper.prepare()的线程内创建处理程序

我在Xamarin.Android中使用TIMER类来重复任务。下面是我的例子

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {

        InitializeLocationManager();
        timer = new Timer(HandleTimerCallback, startTime, 0, TimerWait);

        return StartCommandResult.NotSticky;
    }

    void HandleTimerCallback(object state)
    {
       _locationManager.RequestLocationUpdates(_locationProvider, 8000, 0, this);

    }


    void InitializeLocationManager()
    {
        _locationManager = (LocationManager)GetSystemService(LocationService);
        Criteria criteriaForLocationService = new Criteria
        {
            Accuracy = Accuracy.Fine
        };
        IList<string> acceptableLocationProviders = _locationManager.GetProviders(criteriaForLocationService, true);

        if (acceptableLocationProviders.Any())
        {
            _locationProvider = acceptableLocationProviders.First();
        }
        else
        {
            _locationProvider = string.Empty;
        }


        Log.Debug(TAG, "Using " + _locationProvider + ".");
    }

1 个答案:

答案 0 :(得分:3)

  

我的Time CallBack中出现以下错误

     

Java.Lang.RuntimeException:超时获取异常详细信息无法在未调用Looper.prepare()的线程内创建处理程序

_locationManager.RequestLocationUpdates需要在mainthread上执行,但是通过创建一个计时器,你要求在工作线程上执行它,从而抛出异常。

解决方案:

您可以在服务中创建处理程序,并使用handler.Post执行_locationManager.RequestLocationUpdates

[Service]
public class MyService : Android.App.Service, ILocationListener
{

    LocationManager _locationManager;
    string _locationProvider;
    //Define a handler
    Handler handler;

    public override void OnCreate()
    {
        base.OnCreate();
        //init the handler in oncreate
        handler = new Handler();
    }
    ...

    void HandleTimerCallback(object state)
    {

        handler.Post(() =>
        {
            _locationManager.RequestLocationUpdates(_locationProvider, 8000, 0, this);
        });

    }
    ...
}