为什么我的代码中忽略了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..?

下一篇: TextSwitcher not updating