Android 每30秒调用一次的方法无效

Android 每30秒调用一次的方法无效,android,service,Android,Service,我想每30秒更新一次用户位置,我正在使用截击请求和服务。 下面的代码是: public class CarLocationUpdateService extends Service { Context context; long delay = 1000; // delay for 1 sec. long period = 10000; // repeat every 10 sec. @Nullable @Override public IB

我想每30秒更新一次用户位置,我正在使用截击请求和服务。 下面的代码是:

public class CarLocationUpdateService extends Service {


    Context context;
    long delay = 1000; // delay for 1 sec.
    long period = 10000; // repeat every 10 sec.

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        context = this;


        Handler ha=new Handler();
        ha.postDelayed(new Runnable() {
            @Override
            public void run() {

                //call function

                CarLocationUpdateVolleyClass carLocationUpdateVolleyClass=new CarLocationUpdateVolleyClass(context);
                carLocationUpdateVolleyClass.carLocationRequest();

            }
        }, delay);



        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

将JobScheduler与firbaseJobDispatcher一起使用

您可以使用fused location service获取位置更新。我创建了一个获取位置更新的服务。此代码将在onLocationChanged方法中为您提供位置。 在这里查看我的答案

试试这个:

mHandler = new Handler();
    Runnable r = new Runnable() {
        @override 
        public void run() {
            f();
            mHandler.postDelayed(this, 30000);
        }
    };
    mHandler.postDelayed(r, 30000);
您必须在runnable中再次调用handler.postDelayed方法,因为它只执行一次,这是一种正常行为。将runnable与处理程序分开,如下所示:

Handler ha = new Handler();

private Runnable yourRunnable = new Runnable() {

    @Override
    public void run() {

  CarLocationUpdateVolleyClass carLocationUpdateVolleyClass=new CarLocationUpdateVolleyClass(context);
                carLocationUpdateVolleyClass.carLocationRequest();
     ha.postDelayed(yourRunnable, 30000);
    }
};

ha.post(yourRunnable);
顺便说一句,你的问题告诉我们大约30秒,但你只需每隔10秒打一次电话。

试试这个,它很管用

public void doWork(){
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                // This method will be executed once the timer is over
                // insert your data to db here


                // close this activity
               doWork();
                Toast.makeText(MainActivity.this, "LOL", Toast.LENGTH_SHORT).show();
            }
        }, TIME_OUT);
    }
然后在onstart命令中简单调用此方法


300? 那不是30秒
public void doWork(){
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                // This method will be executed once the timer is over
                // insert your data to db here


                // close this activity
               doWork();
                Toast.makeText(MainActivity.this, "LOL", Toast.LENGTH_SHORT).show();
            }
        }, TIME_OUT);
    }
doWork();