为什么我的代码中忽略了scheduleAtFixedRate ..?
格雷格
这是我的新代码根据您的建议。 它不起作用。 我收到了一堆“刚刚发送了带有坐标的短信”。 所以它仍然没有睡15秒。
package com.droid.service;
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; import java.util.TimerTask;
导入android.app.Service; import android.content.Context; 导入android.content.Intent; 导入android.location.Location; 导入android.location.LocationListener; 导入android.location.LocationManager; 导入android.os.Bundle; 导入android.os.Handler; 导入android.os.IBinder; import android.os.Looper;
公共类DroidService扩展服务{
private LocationManager lm;
private LocationListener locationListener;
private Location location = null;
@Override
public IBinder onBind(Intent arg0)
{
return null;
}
// @Override
// public void onCreate()
// {
// super.onCreate();
// initService();
// }
private static final int PERIOD = 15000;
Handler mHandler;
Runnable mRunnable;
@Override
public void onCreate()
{
super.onCreate();
mHandler = new Handler();
mRunnable = new Runnable()
{
public void run()
{
updateNotification();
mHandler.postDelayed(this, PERIOD);
System.out.println("PAUSE FOR 15 SECONDS..!!");
}
};
}
@Override
public void onStart(final Intent intent, final int startId)
{
super.onStart(intent, startId);
mRunnable.run();
}
// private void initService()// {// System.out.println(“In initService..Droid Service ... !!”); // int initialDelay = 15000; // 15秒后启动// // int period = 300000; //每5分钟重复一次// // int period = 1800000; //每30分钟重复一次// int period = 15000; //每15秒重复进行一次测试// Timer timer = new Timer(); // TimerTask task = new TimerTask()// {// public void run()// {// Looper.prepare(); // updateNotification(); // Looper.loop(); //} //}; // timer.scheduleAtFixedRate(task,initialDelay,period); //}
protected void updateNotification()
{
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationlistener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
public static class DateUtils
{
public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
public static String now()
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return sdf.format(cal.getTime());
}
}
private class MyLocationlistener implements LocationListener
{
public void onLocationChanged(Location loc)
{
double lat = loc.getLatitude();
double lon = loc.getLongitude();
String latitude = Double.toString(lat);
String longitude = Double.toString(lon);
String coords = latitude + longitude;
// comment out text message for debug mode
// SmsManager sm = SmsManager.getDefault();
// sm.sendTextMessage("phoneNumber", null, coords, null, null);
System.out.println("Just sent a text message with coords");
}
public void onProviderDisabled(String provider)
{
}
public void onProviderEnabled(String provider)
{
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}
}
这是我的代码
即使我的scheduleAtFixedRate设置为10秒,我也会收到“刚刚发送带有坐标的短信”,每秒发送一次。
我得到了这个在一个正常的程序中工作,但在Android平台上,他们希望你使用Looper ....并且看起来我的代码已经在这个Looper中了,所以它忽略了我的scheduleAtFixedRate(10秒)
任何帮助是极大的赞赏。
package com.droid.service;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Looper;
public class DroidService extends Service
{
private LocationManager lm;
private LocationListener locationListener;
private Location location = null;
@Override
public IBinder onBind(Intent arg0)
{
return null;
}
@Override
public void onCreate()
{
super.onCreate();
initService();
}
private void initService()
{
System.out.println("In initService..!!");
int initialDelay = 15000; // start after 15 seconds
// int period = 300000; // repeat every 5 minuets
// int period = 1800000; // repeat every 30 minuets
int period = 15000; // repeat every 15 seconds for testing
Timer timer = new Timer();
TimerTask task = new TimerTask()
{
public void run()
{
Looper.prepare();
updateNotification();
Looper.loop();
Looper.myLooper().quit();
}
};
timer.scheduleAtFixedRate(task, initialDelay, period);
}
protected void updateNotification()
{
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationlistener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
private class MyLocationlistener implements LocationListener
{
public void onLocationChanged(Location loc)
{
double lat = loc.getLatitude();
double lon = loc.getLongitude();
String latitude = Double.toString(lat);
String longitude = Double.toString(lon);
String coords = latitude + longitude;
// comment out text message for debug mode
// SmsManager sm = SmsManager.getDefault();
// sm.sendTextMessage("phoneNumber", null, coords, null, null);
System.out.println("Just sent a text message with coords");
}
public void onProviderDisabled(String provider)
{
}
public void onProviderEnabled(String provider)
{
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}
}
我认为这里的误解并不是Android想要使用Looper,但是你不应该使用Timer来满足你期望的行为。 而不是定时器,你必须操作一个Looper。 我有一段时间没有直接使用Looper,因为还有其他组件会将它们的细微差别抽象出来。 但是我认为Looper.loop()不应该返回,直到外部实体或者中断你的线程或者退出你的循环。 所以我不认为这会起作用,但我可能是错的。
如果你想创建一个脉冲,你可以使用一个Handler。 Handler允许你在Looper线程上工作。 因此,以您拥有的例子来说,
private static final int PERIOD = 15000;
Handler mHandler;
Runnable mRunnable;
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler();
mRunnable = new Runnable() {
public void run() {
updateNotication();
mHandler.postDelayed(this, PERIOD);
}
};
}
我会从这里承认我只是猜测我知道你的应用程序的预期结果。 我假设你不需要双向沟通,因为你的IBinder为空。
@Override
public void onStart() {
mRunnable.run();
}
// The rest of your code.
..
尝试从onStart()调用initService。
对我来说基本上最好的选择就是把这个叫做创造。 现在它正在做我想做的事情。 感谢您的所有输入..! 这帮助我解决了这个问题。
链接地址: http://www.djcxy.com/p/74933.html上一篇: Why is my scheduleAtFixedRate being ignored in my code..?