我需要从android应用程序中检索android设备坐标,并将这些坐标发送给服务器,即使应用程序停止和/或设备处于睡眠状态也是如此。我需要以固定的时间间隔执行此操作。
我清楚地知道这是一个复杂的解决方案,但是您能否提及解决此问题所需的关键方面?在开发应用程序的过程中,我需要选择一个方向。
我已经在网络上进行了广泛的研究,有许多解决方案,但是其中一些似乎已经使用了几年,而另一些则倾向于以不同的方式解决特定的问题。不可能尝试所有这些内容,并从所有这些信息中组合出可以满足我的需求的解决方案,并且是最佳且稳定的解决方案。
谢谢
我遇到了同样的问题,该解决方案对我有用:
定义如下所示的工人:
class SendLocationWorker(
context: Context,
workerParams: WorkerParameters
) : Worker(context, workerParams) {
private var retrofit: Retrofit? = null
private var locationApi: MyApi? = null
private val userLocationDao = AppDatabase.getInstance(applicationContext)
.userLocationDao()
override fun doWork(): Result {
return try {
if (retrofit == null) {
retrofit = MasterRetrofit().initRetrofit(Constants.MAIN_URL)
}
if (locationApi == null) {
locationApi = retrofit!!.create(MyApi::class.java)
}
callApi()
Result.success()
} catch (ex: Exception) {
Result.failure()
}
}
@SuppressLint("CheckResult")
private fun callApi() {
val locations = getUserLocations()
if (locations.isNotEmpty()) {
val request = InsertLocationUserRequest()
request.saveTrackings = locations
locationApi!!.SaveTracking(request)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(SuccessMapper<Response<InsertLocationUserResponse>>())
.subscribe(
{ response ->
if (response.body()!!.success) {
Observable.fromIterable(locations)
.forEach { location -> location.isSync = true }
userLocationDao.update(locations)
}
},
{ throwable ->
},
{
}
)
}
}
private fun getUserLocations(): List<UserLocation> {
return userLocationDao.findAll("isSync", "0")
}
}
此外,您需要像这样在MasterActivity或MasterPresenter中定义一个方法:
@Override public void sendStoredLocationToServer() {
Constraints myConstraints = new Constraints.Builder()
.setRequiresBatteryNotLow(true)
.build();
PeriodicWorkRequest sendLocationWorkerRequest =
new PeriodicWorkRequest.Builder(SendLocationWorker.class, 10000, TimeUnit.MILLISECONDS)
.setConstraints(myConstraints)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("sendLocationWorker",
ExistingPeriodicWorkPolicy.REPLACE,
sendLocationWorkerRequest);
}
然后您可以在任何需要的地方通过MasterActivity或MasterPresenter致电您的工作人员:
sendStoredLocationToServer();
该工作人员将您的位置保存在数据库中,并在可能的情况下将其发送,并将所有发送项目标记为true(使用isSyns
标志)。
这个想法对我来说很有效。