Android Location From service 每 10 秒...但是 location 显示 Null,当我将 Activity 更改为 Service

Android Location From service for every 10 seconds... But location Displays Null,When I changed Activity to Service

我按照this每10秒获取一次位置坐标

所以现在我想将 Activity 更改为服务,以便我将其作为后台服务启动以每 10 秒获取一次位置更新...

但是这里我修改了UpdateUI()方法

private void updateUI() {
    mLatitudeTextView.setText(String.format("%s: %f", mLatitudeLabel,
            mCurrentLocation.getLatitude()));
    mLongitudeTextView.setText(String.format("%s: %f", mLongitudeLabel,
            mCurrentLocation.getLongitude()));
    mLastUpdateTimeTextView.setText(String.format("%s: %s", mLastUpdateTimeLabel,
            mLastUpdateTime));
}

 private void updateUI() {

    try{
    mlatitude = String.valueOf(mCurrentLocation.getLatitude());
    mlongitude = String.valueOf(mCurrentLocation.getLongitude());
    }
    catch(Exception e){
        Toast.makeText(this,"Location Not Found",Toast.LENGTH_LONG).show();
    }
}

我正在 onStartCommand() 庆祝这些价值观 我有这样的启动命令

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        buildGoogleApiClient();
        mRequestingLocationUpdates = true;
        updateUI();

        return mStartMode;  
}

但这里它只运行了第一次,它没有显示值,也没有每 10 秒更新或不更新 运行。

然而,在 Activity 它工作正常时,我每 10 秒获取一次位置更新...

任何人都可以建议如何在服务中提供相同的服务...以便我获得更新

更新 1: 为了 运行 每 10 秒一个服务,我添加了这个...

private final Integer TEN_SECONDS = 10000;
    public void sendSendLocation() {
    new Handler().postDelayed(new Runnable() {
            public void run () {
                updateUI();
                new Handler().postDelayed(this, TEN_SECONDS);
            }
    },TEN_SECONDS);
}

但是这里位置显示为空...有人可以建议我...

更新二:

实际上,如果我添加它,我需要在 OnStartCommand 中添加 updateValuesFromBundle(savedInstanceState)...服务将起作用。但因此我无法提供这项服务 Bundle savedInstanceState...

private void updateValuesFromBundle(Bundle savedInstanceState) {
        Log.i(TAG, "Updating values from bundle");
        if (savedInstanceState != null) {
            // Update the value of mRequestingLocationUpdates from the Bundle, and make sure that
            // the Start Updates and Stop Updates buttons are correctly enabled or disabled.
            if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
                mRequestingLocationUpdates = savedInstanceState.getBoolean(
                        REQUESTING_LOCATION_UPDATES_KEY);
                setButtonsEnabledState();
            }

            // Update the value of mCurrentLocation from the Bundle and update the UI to show the
            // correct latitude and longitude.
            if (savedInstanceState.keySet().contains(LOCATION_KEY)) {
                // Since LOCATION_KEY was found in the Bundle, we can be sure that mCurrentLocation
                // is not null.
                mCurrentLocation = savedInstanceState.getParcelable(LOCATION_KEY);
            }

            // Update the value of mLastUpdateTime from the Bundle and update the UI.
            if (savedInstanceState.keySet().contains(LAST_UPDATED_TIME_STRING_KEY)) {
                mLastUpdateTime = savedInstanceState.getString(LAST_UPDATED_TIME_STRING_KEY);
            }
            updateUI();
        }
    }

所以我运行宁UpdateUI()直接在OnStartCommand()服役

有没有人给我推荐这种类型的?

试试这个代码

private void startProcess(){
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
          updateUI();  
        }
    }, 0, 10000);
}

这个startProcess方法写在startCommand方法里

您可以使用处理程序或定时器任务。

报告的一些 TimerTask 问题:

  • 无法更新 UI 线程
  • 内存泄漏
  • 不可靠(并不总是有效)
  • 长 运行 任务可能会干扰下一个预定事件

处理程序:

 private final Integer TEN_SECONDS = 10000;
    public void sendSendLocation() {
    new Handler().postDelayed(new Runnable() {
            public void run () {
                updateUI();
                new Handler().postDelayed(this, TEN_SECONDS);
            }
    },TEN_SECONDS);
}

关注this.....您的代码是正确的,但未使用onConnected()...如果您在服务中使用它...您必须添加此行.... .. 在您的代码中,您可以使用 googleApiclient.connect();

所以在你的代码中

protected synchronized void buildGoogleApiClient() {
    Log.i(TAG, "Building GoogleApiClient");
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    mGoogleApiClient.connect(); **// Add this line**
    createLocationRequest();
}

你错过了这个我也遇到了同样的问题但是在添加这个之后它对我的后台服务有用...