我在我的服务中使用Timer和TimerTask,我正在安排GPS定期使用此方法检查@ Service - onCreate()
scheduleAllGPST.scheduleAtFixedRate(new AllGPSTimer(), 0,
everyInterval);
我的服务类代码片段:
//class inside service class
class AllGPSTimer extends TimerTask {
public void run() {
if (!canGetLocation) stopLocationRequest();
else requestLocation();
}
}
// Service class method
public void requestLocation() {
try {
locListener = new mylocationlistener();
locationManager.requestLocationUpdates(provider, 0, 0, locListener);// Error happens at this line
}
catch (Exception e) {
e.printStackTrace();
}
}
public void stopLocationRequest() {
try {
locationManager.removeUpdates(locListener);// And also it happens at this line
}
catch (Exception e) {
e.printStackTrace();
}
}
我收到此错误:
Error :
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:139)
at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:137)
at android.location.LocationManager._requestLocationUpdates(LocationManager.java:708)
at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630)
at com.mobile.sales.GPSService.requestLocation(GPSService.java:146)
at com.mobile.sales.GPSService$AllGPSTimer.run(GPSService.java:140)
at java.util.Timer$TimerImpl.run(Timer.java:289)
从错误中,我猜这个requestLocationUpdates()和 removeUpdates()只能在Service类的Main线程中使用,而不能从主线程的衍生线程中使用。我猜对了吗?
那么Service类的Activity类中是否有类似runOnUiThread(runnable)的方法?
请帮助我处理位置API方法和计时器任务的衍生线程?如果我猜错了,请告诉我。
谢谢!
答案 0 :(得分:0)
公共类GpsManager {
public GpsManager()
{
// TODO Auto-generated constructor stub
}
LocationManager lm;
LocationListener ll;
public void Start(Context context)
{
lm = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
isactive = true;
handler=new Handler(){
@Override
public void handleMessage(Message msg)
{
if(isactive)
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
super.handleMessage(msg);
}
};
ll = new MyLocationListener(context, lm,handler);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
}
Handler handler;
public boolean isactive;
public void Stop()
{
lm.removeUpdates(ll);
isactive = false;
}
class MyLocationListener implements LocationListener
{
Context _con;
LocationManager _lm;
Handler _handler;
public MyLocationListener(Context con, LocationManager lm,Handler h)
{
_lm = lm;
_con = con;
_handler=handler;
}
@Override
public void onLocationChanged(Location location)
{
if (location != null)
{
Toast.makeText(
_con,
"lon = " + location.getLongitude() + ". lat = "
+ location.getLatitude(), Toast.LENGTH_SHORT)
.show();
lm.removeUpdates(this);
Thread th=new Thread(new Runnable()
{
@Override
public void run()
{
Message msg=Message.obtain();
_handler.sendMessageDelayed(msg,1000);
}
});
th.run();
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
Toast.makeText(_con, "status change " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderEnabled(String provider)
{
Toast.makeText(_con, "provider enable " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider)
{
Toast.makeText(_con, "provider disable " + provider,
Toast.LENGTH_SHORT).show();
}
}
}