我有一个简单的服务,这项服务的工作是每分钟运行并获得用户的当前位置。我的代码不会每分钟重复一次。
我的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 + ".");
}
答案 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);
});
}
...
}