我正在使用Transitions API,前 24-48 小时一切正常 - 我从 API 收到身体活动变化,但 24-48 小时后什么也没有。
在 Transitions API Receiver 下,我使用Foreground Service48 小时后仍处于活动状态的接收器。我可以通过查看日志来验证这一点;此外,Location (Fused Location Client)24-48 小时后仍然会有更新,而 Transition API 似乎已经死了。
有人经历过这个吗?我确实认为使用 Worker 重置(取消注册然后再次注册)转换 API 可能是替代方案(每 1-2 小时一次)。不确定这是否有帮助。我有一种感觉,当应用程序进入打瞌睡模式/某种睡眠状态时,就会发生这种情况。
另外,我的前台服务使用exported=false,也许将其设置为true会有帮助?(我希望有人给出答案并解释为什么你应该使用其中之一)
操作系统:安卓12
好的,因此,我决定仔细研究一下在我的项目中实施junit测试的情况。然后,我偶然发现了一篇文章,其中写到了使用依赖注入框架(例如Dagger2和Koin)来简化测试的重要性。
我试图读取-究竟什么是DI。我将其理解为解决A类依赖对象(例如B类和C类)的一种方式。
我现在通常要做的是:
在活动中,我创建ViewModel。ViewModel需要访问数据,所以对于数据我有SomeRepository课。然后,我通常SomeRepository通过ViewModel构造函数或使用属性注入。据我了解,如果我没有记错的话,那也是某种类型的依赖注入(如果我记错了,请更正我)。
那么,如果我现在开始使用Dagger 2,我将获得什么好处?也许简单的代码比较会使它更清晰?提前致谢。
活动:
val someRepository = SomeRepository()
viewModel.init(someRepository)
Run Code Online (Sandbox Code Playgroud)
在ViewModel中:
class SomeViewModel : ViewModel {
private lateinit var repository: SomeRepository
fun init(val someRepo: SomeRepository) {
this.repository = someRepo
}
}
Run Code Online (Sandbox Code Playgroud) 所以通常当你不得不进行不同的 API 调用并等待时,你会做这样的事情:
viewModelScope.launch {
withContext(dispatcherProvider.heavyTasks) {
val apiResponse1 = api.get1() //suspend function
val apiResponse2 = api.get2() //suspend function
if (apiResponse1.isSuccessful() && apiResponse2.isSuccessful() { .. }
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我必须使用不同的参数同时执行多个相同的 API 调用,会发生什么:
viewModelScope.launch {
withContext(dispatcherProvider.heavyTasks) {
val multipleIds = listOf(1, 2, 3, 4, 5, ..)
val content = arrayListOf<CustomObj>()
multipleIds.forEach { id ->
val apiResponse1 = api.get1(id) //suspend function
if (apiResponse1.isSuccessful()) {
content.find { it.id == id }.enable = true
}
}
liveData.postValue(content)
}
}
Run Code Online (Sandbox Code Playgroud)
第二种方法的问题是它将遍历multipleIds列表的所有 id并进行异步调用,但content可能会在此之前发布。如何等待每个循环的所有响应完成,然后 …
我有一个DialogFragment.
布局:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxHeight="280dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/line/>
<View
android:id="@+id/line"
android:layout_width="wrap_content"
android:layout_height="1dp"
android:background="@color/black"/>
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
我想最初"包装回收器视图内容"(高度),但它不能超过280dp.似乎android:maxHeight没有任何影响.
当我尝试编译我的项目时,出现以下奇怪错误:
What went wrong:
Execution failed for task ':android:transformClassesWithDexBuilderForProdDevelopmentDebug'.
Run Code Online (Sandbox Code Playgroud)
com.android.build.api.transform.TransformException:com.android.builder.dexing.DexArchiveBuilderException:com.android.builder.dexing.DexArchiveBuilderException:无法处理/Users/.../.gradle/caches/transforms-1 /files-1.1/play-services-location-11.2.2.aar/f5b9886774f73d8b64cfd9701f91e8cc/jars/classes.jar
我试过的
multiDexEnabled true到应用gradle。android.enableD8.desugaring = true和android.enableD8=true对gradle.propertiesAS版本:3.1.4
应用程式Gradle档案:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion Android.compileSdkVersion
buildToolsVersion Android.buildToolsVersion
flavorDimensions "...", "type"
defaultConfig {
applicationId "xxx"
versionName 'xxx'
versionCode xxx
minSdkVersion 21
targetSdkVersion Android.targetSdkVersion //Android.targetSdkVersion holds value "27"
multiDexEnabled true
}
dexOptions {
javaMaxHeapSize "6g"
preDexLibraries = true
}
buildTypes {
release …Run Code Online (Sandbox Code Playgroud) 我正在使用AltBeacon库来获取RSSI和TxPower值。
RSSI = -90 发射功率 = -83
我发现计算距离是通过使用以下公式完成的:
d = 10 ^ ((TxPower -Rssi) / 10n) (n ranges from 2 to 4)
Run Code Online (Sandbox Code Playgroud)
所以就我而言,这将是(n = 2):
d = 10 ^ (7 / 10 * 2) = 2.2387211385683394
Run Code Online (Sandbox Code Playgroud)
我的计算正确还是这个公式不好?另外,如果存在更好的距离计算公式是否可以获得可以在学士论文中使用的参考?
我有一个代码:
val d = Single
.zip<List<X>, Optional<Y>, DataContent>(
xSingle,
YSingle,
BiFunction { x, y ->
val b = if (y.isPresent()) {
y.get()
} else {
null
}
return@BiFunction DataContent(x, b)
})
.subscribe({ data ->
...
}, { t ->
...
})
Run Code Online (Sandbox Code Playgroud)
我听说,使用Optional检查示例中所示的空值是不好的做法。真的吗?为什么?有人可以展示使用的替代方案RxJava2吗?
我有一个TestService,我在其中执行异步任务来获取数据。我想等待回复后再继续。
public List<Data> getData() {
List<Data> data = new ArrayList<>();
Disposable disposable = repository.getDataFromApi(false)
.observeOn(AndroidSchedulers.mainThread())
.subscribe( newData -> {
data.addAll(newData);
}, __ -> { });
mCompositeDisposable.add(disposable);
//Here I want to stop till "Data" arraylist is filled with data
... do something with data
}
Run Code Online (Sandbox Code Playgroud)
在 Volley 中,我只需打电话 req.executeSynchronously();就能实现。由于getData()必须已经返回数据,我必须以某种方式让它等到我得到响应。怎么做?我在用着Single。
我的方法是使用 getBlocking();
public List<Data> getData() {
List<Data> data = new ArrayList<>();
Disposable disposable = repository.getDataFromApi(false)
.observeOn(AndroidSchedulers.mainThread())
.blockingGet();
.subscribe( newData -> {
data.addAll(newData);
}, __ -> …Run Code Online (Sandbox Code Playgroud) 我的应用程序基于 GPS 数据,为此我正在使用Fused-location-provider. 从现在开始,我发现 GPS 出现抖动,并且一些 GPS 坐标偏离了道路。这是无法接受的。我试图做的是实施Kalman filter并且我做到了:
fun process(
newSpeed: Float,
newLatitude: Double,
newLongitude: Double,
newTimeStamp: Long,
newAccuracy: Float
) {
if (variance < 0) { // if variance < 0, object is unitialised, so initialise with current values
setState(newLatitude, newLongitude, newTimeStamp, newAccuracy)
} else { // else apply Kalman filter
val duration = newTimeStamp - timeStamp
if (duration > 0) { // time has moved on, so the uncertainty in the current position …Run Code Online (Sandbox Code Playgroud) 我用来Coroutines处理异步作业:
viewModelScope.launch {
val userResponse = getUsers() //suspendable function
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是停止所有现有/正在进行的协程作业。想法是我单击不同的选项卡。如果getUsers()需要长达 5 秒的时间并且用户从“用户”选项卡单击到“作业”选项卡,我希望停止现有的 API 调用并且不会观察到响应。
我尝试做viewModelScope.cancel(),但这似乎不起作用。
问题是 - 如何在单击按钮时取消现有作业?
我有
活动A->片段A
[由Fragment A我决定创建Activity B]
片段A - >活动B。
当我按返回按钮时,我返回到Fragment A包含数据列表的位置。按下后退按钮时,我想更新此列表。不,我不在本地存储数据,并且发出另一个请求太昂贵了。有没有简单的方法可以通过按[返回从活动B到片段A]的后退按钮传递修改的对象X?怎么样?