为什么我的scheduleAtFixedRate在我的代码中被忽略..?

时间:2010-10-21 04:28:15

标签: android

格雷格

根据您的建议,这是我的新代码。那没起效。我收到了一堆“刚刚发送带有coords的短信”。所以它仍然没有睡15秒。

package com.droid.service;

import java.text.SimpleDateFormat; import java.util.Calendar; 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.Handler; import android.os.IBinder; import android.os.Looper;

public class DroidService扩展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 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(“在initService..Droid服务中...... !!”); // int initialDelay = 15000; // 15秒后开始 // // int period = 300000; //每5分钟重复一次 // // int period = 1800000; //每30分钟重复一次 // int period = 15000; //每15秒重复一次测试 //定时器计时器=新的计时器(); // 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秒,我也会发送“只是发送带有coords的短信”,就像每秒发送一次。

我让它在正常的程序中工作,但是在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)
        {
        }
    }
}

3 个答案:

答案 0 :(得分:1)

我认为这里的误解并不是Android想要使用Looper,但是你不应该使用Timer来实现你想要的行为。而不是Timer,你必须操纵一个Looper。我有一段时间没有直接使用过Looper,因为还有其他组件可以抽象出它的很多细微差别。但是我认为Looper.loop()不应该返回,直到外部实体中断你的线程或退出你的looper。所以我认为这不会起作用,但我可能错了。

如果要创建脉冲,可以使用处理程序。 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.
        ..

答案 1 :(得分:0)

尝试从onStart()调用initService。

答案 2 :(得分:0)

基本上我最好的选择就是打电话给我。现在它正在做我想要它做的事情。感谢您的所有投入.. !!这有助于我解决问题。