代码之家  ›  专栏  ›  技术社区  ›  paperduck

如何等待requestLocationUpdates()回调意图完成?

  •  1
  • paperduck  · 技术社区  · 8 年前

    我想在中等待回调意图 FusedLocationProviderClient.requestLocationUpdates()

    通常我会使用 startWakefulService() 等待异步服务完成,但我不知道如何将其与requestLocationUpdates()一起使用。

    Task t = flpc.requestLocationUpdates(locationRequest, pe);
    while (! t.isSuccessful()) {
        Log.v(TAG, "Waiting for result...");
    }
    
    3 回复  |  直到 8 年前
        1
  •  1
  •   Husayn Hakeem    8 年前

    如果你对RxJava/RxAndroid有点熟悉,你可以将你的方法调用封装在一个可观察的例子中(或可调用的,单个的,任何你认为最好的),在UI之外的另一个线程上运行它,然后一旦你从你的方法得到一个结果,你就在主线程上收到它,然后用它做任何你想做的事情。

    在代码中,它将如下所示:

    Observable.fromCallable(() -> flpc.requestLocationUpdates(locationRequest, pe))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(task -> onLocationUpdatesSuccess(task), throwable -> Log.e(TAG, throwable.getMessage()));
    

    否则,另一种解决方案是将您的方法封装在AsyncTask中,例如,您将得到如下结果:

        new AsyncTask<Void, Void, Task>() {
                @Override
                protected Task doInBackground(Void... params) {
                    return flpc.requestLocationUpdates(locationRequest, pe);
                }
    
                @Override
                protected void onPostExecute(Task task) {
                    onLocationUpdatesSuccess(task)
                }
        }.execute();
    
        2
  •  0
  •   paperduck    8 年前

    以下是我最后做的事情:

    获取() 实例化wakelock并在类中为其分配静态wakelock变量。它是一种实例方法(非静态),因为它使用需要上下文的PowerManager。

    发布()

    所有这些的“诀窍”是创建一个实例wakelock并将其分配给一个静态变量。这允许在无法访问我的类实例的服务中修改wakelock。

        3
  •  0
  •   Gnzlt    6 年前

    以下是我仅获取一个位置的解决方案:

    private fun getNewLocation(): Single<Location> =
        Single.create { emitter ->
            locationClient.requestLocationUpdates(locationRequest, object : LocationCallback() {
                override fun onLocationResult(result: LocationResult) {
                    locationClient.removeLocationUpdates(this)
    
                    val location = result.locations.firstOrNull()
                    if (location != null) {
                        emitter.onSuccess(location)
                    } else {
                        emitter.onError(NullPointerException("Null location"))
                    }
                }
    
                override fun onLocationAvailability(result: LocationAvailability) {
                    if (!result.isLocationAvailable) {
                        locationClient.removeLocationUpdates(this)
                        emitter.onError(IllegalStateException("Location not available"))
                    }
                }
            }, Looper.getMainLooper())
        }
    

    locationRequest 看起来像:

    private val locationRequest =
        LocationRequest()
            .setExpirationDuration(TimeUnit.SECONDS.toMillis(30L))
            .setInterval(TimeUnit.SECONDS.toMillis(15L))
            .setNumUpdates(1)