仅在特定时间运行脚本

时间:2015-03-25 00:22:48

标签: android schedule timertask

我有一个检测位置的代码,我只想工作2分钟。

当我触发start()方法脚本必须工作几乎2分钟。

问题在于,如何在特定时间运行我的脚本。 我使用了这段代码,但没有正确运行。

不要在Timer()。schedule()

中触发stop()方法
public class a implements LocationListener{
    private LocationManager locationManager;
    private String provider;
    private Location lastloc;
    private Context _context;

    public a(Context context){
        _context = context;
    }

    public void start(){
        locationManager = (LocationManager) _context.getSystemService(Context.LOCATION_SERVICE);


        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, (LocationListener) this);

        new Timer().schedule(
            new TimerTask(){
                public void run() {
                    stop();
                }
            }
        ,System.currentTimeMillis(), 2*60*1000);
    }

    public void stop(){
        Log.d("states","stop");
        locationManager.removeUpdates((LocationListener) this);
    }

    @Override
    public void onLocationChanged(Location location) {
        Log.d("states", "onLocationChanged()");
        lastloc = location;
    }

    @Override
    public void onProviderDisabled(String arg0) {
    }

    @Override
    public void onProviderEnabled(String arg0) {
    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    }
}

2 个答案:

答案 0 :(得分:0)

我终于通过使用处理程序解决了我的问题。

阅读本页:Using Bundle Android to Exchange Data Between Threads

a.java

public class a implements LocationListener{
    private LocationManager locationManager;
    private String provider;
    private Location lastloc;
    private Context _context;

    private Thread workingthread = null;
    final Handler mHandler = new Handler(){
        public void handleMessage(Message msg) {
            Log.d("states","return msg from timer2min");
            if(msg.what==1){
                stop();
            }
            super.handleMessage(msg);
        }
    };

    public a(Context context){
        _context = context;
    }

    public void start(){
        locationManager = (LocationManager) _context.getSystemService(Context.LOCATION_SERVICE);

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, (LocationListener) this);

        workingthread=new timer2min(mHandler);
        workingthread.start();
    }

    public void stop(){
        Log.d("states","stop");
        locationManager.removeUpdates((LocationListener) this);
    }

    @Override
    public void onLocationChanged(Location location) {
        Log.d("states", "onLocationChanged()");
    }

    @Override
    public void onProviderDisabled(String arg0) {
    }

    @Override
    public void onProviderEnabled(String arg0) {
    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    }
}

timer2min.java

public class timer2min extends Thread {
    private Handler hd;

    public timer2min(Handler msgHandler){
        hd = msgHandler;
    }

    public void run() {
        try {
            Thread.sleep(2*60*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Message msg = hd.obtainMessage();
        msg.what = 1;
        hd.sendMessage(msg);
    }
}

答案 1 :(得分:0)

再次检查Timer的代码。通常,Timer代码应该是:

Timer.schedule(TimerTask,
        delayTime); // delay a task before executed for the first time, in milliseconds

由于您使用delayTime执行了System.currentTimeMillis()System会选择自午夜以来的当前时间(以毫秒为单位),以便在数百万之后执行TimerTask毫秒。

因此,请使用以下代码:

Timer timer = new Timer();
timer.schedule(new TimerTask(){
        @Override
        public void run() {
            // do your thing here
        }
    }, 2*60*1000);

有关您创建的Timer的类型,请参阅此documentation