我正在寻找一种在 Android 活动中组合不同功能的方法,该方法应该可用于不同的活动类。具体来说,问题是由于覆盖 open 方法而产生的,其中还必须调用 super 的实现。
open class FirstActivity : FragmentActicity() {
override fun onStart() {
super.onStart()
doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
这很简单,但它不可重复使用。例如,我可能希望使用不同的基本活动类具有相同的行为:
open class SecondActivity : AppCompatActivity() {
override fun onStart() {
super.onStart()
doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
我必须复制代码的地方。如果我有一个非常基本的功能,比如跟踪活动的状态,我会或多或少地希望在我所有具有不同基类的活动中使用它。当我想创建更多可以组合的功能时,情况会变得更糟:
open class ThirdActivity : FragmentActivity() {
override fun onResume() {
super.onResume()
doSomeResuming()
}
}
open Class FirstActivityAgain : ThirdActivity {
override fun onStart() {
super.onStart()
doSomething()
}
}
class MyFragmentActivity : FirstActivity() {
override fun onStop() {
doSomethingElse()
super.onStop()
}
}
class MyFragmentActivityWithResuming …Run Code Online (Sandbox Code Playgroud) android dependency-injection composition android-activity kotlin
我试图了解Android上Firebase的离线功能到底有多远.
据我所知,应该可以使数据库"持久" FirebaseDatabase.getInstance().setPersistenceEnabled(true);
文件内容如下:
Firebase实时数据库存储从查询返回的数据,以便在脱机时使用.对于在脱机时构建的查询,Firebase实时数据库将继续为以前加载的数据工作.如果未加载请求的数据,Firebase实时数据库将从本地缓存加载数据.当我们重新上线时,我们的数据将加载并反映查询.
当离线状态被强迫时,这也是真的goOffline吗?
在这个问题中,用户得到了firebase支持的答案:
虽然您可以使用goOffline()强制客户端长时间离线,但性能会随着时间的推移而恶化.Firebase客户端将对中间状态更改进行排队,而不是像服务器那样更新存储状态.
这是否意味着"本地数据库"实际上没有像因连接丢失而离线时更新?
因为大多数时候任何查询或值事件监听器都没有返回,所以onDataChange永远不会被调用为onCanceled(我已经检查过!)
如果只有连接丢失,它实际上就像宣传的一样,虽然有时会有一分钟的延迟,这本身就是一个问题.
goOffline()如果这只是完全停止与数据库的交互,那么甚至提供该方法的意图是什么?
在我的实现中,应用程序启动脱机,具有匿名身份验证.所以在开始的时候,"本地数据库"将是完全空的.但是,值事件至少应该使用空数据快照触发onDataChanged吗?
我尝试保持在线状态,直到收到匿名UID并在firebase数据库中添加一个空条目,然后查询/缓存.之后,如果我打电话goOffline,就不能再添加条目,也不会再回答任何查询.
与上面提到的问题类似,我的计划是为用户提供保持离线的选项,当然还有在本地缓存中建立存储的写事件的缺点(但这不应该是一个大问题.没有那么多数据)
那么即使可能,我怎样才能完成这项工作呢?
我唯一能看到的是在开始时为实际的离线功能提供一些不同的数据库解决方案,当用户选择上线时,必须将其转换并转移到firebase.
我有一个存储库类,它使用 MutableLiveData 对象(仅公开为 LiveData),将异步 Web 查询的结果返回到 ViewModel。然后,ViewModel 使用 Transformation 将结果映射到视图观察到的另一个 MutableLiveData。
我认为我通过分离关注点来遵循此模块中推荐的架构,但我发现很难为 ViewModel 编写单元测试:
class DataRepository ( private val webservice: DataWebService ) {
private val _exception = MutableLiveData<Exception?>(null)
val exception : LiveData<Exception?> get() = _exception
private val _data = MutableLiveData<List<DataItem>>()
val data: LiveData<List<DataItem>> = _data
private val responseListener = Response.Listener<String> {response ->
try {
val list = JsonReader(SearchResult.mapping).readObject(response).map {
//Data transformation
}
_exception.value = null
_data.value = list
} catch (ex: Exception) {
_exception.value = ex
_data.value = emptyList()
} …Run Code Online (Sandbox Code Playgroud) 所以我有这个数据对象,它有一组字符串(代表不可索引的关键字,但在这里无关紧要)作为成员,当这个集合为空时,Room 表现不佳:
@Parcelize
@Entity(tableName = TABLE_NAME)
data class DataItem(
@PrimaryKey
@ColumnInfo(name = COLUMN_ID, index = true) val id: Long,
@ColumnInfo(name = COLUMN_GROUP, index = true) var group: Int,
@ColumnInfo(name = COLUMN_TEXT, index = true) var text: String,
@ColumnInfo(name = COLUMN_STRING_SET) var stringSet: Set<String>
): Parcelable {
companion object
{
const val TABLE_NAME = "TestDataItems"
const val COLUMN_ID = "id"
const val COLUMN_GROUP = "groupColumn"
const val COLUMN_TEXT = "text"
const val COLUMN_STRING_SET = "stringSet"
}
}
Run Code Online (Sandbox Code Playgroud)
首先,我收到一个错误,因为 room 不知道如何处理这些数据。公平地说,让我们实现一个类型转换器。在没有 JSON …
我正在编写一个程序,一次创建多个线程(5-20),以并行计算单个问题的迭代.现在,这些线程中的任何一个都可以提供有效的解决方案,此时应该将此解决方案(以对象引用的形式)报告回主线程以停止所有其他线程并基于此解决方案创建新线程.
找到解决方案后,主线程快速响应以停止/暂停线程并处理解决方案至关重要.
我已经研究了观察者模式,C++ 11的std::async方法和std::future/ promise对象,但通常这些例子都会期望所有线程的结果然后被收集和处理.在我的应用程序中,只有一个"赢家"线程可以提供解决方案,但我事先无法知道它将是哪一个.
由于我是并行编程的新手,我想知道实现这个的最佳方法是什么?使主线程等待多个其他线程/并行任务中的一个结果的最有效方法是什么?
编辑澄清:我有一个需要分析的实时信号.我有不同的算法可以确定系统的不同状态的子集."获胜"算法将信号与这些类别之一进行匹配,因此当前系统状态是已知的.根据当前状态,系统将来可能会进入不同的状态,这也需要进行检测.目前,所有这些算法在循环中顺序运行,直到可以找到拟合类别,此时主线程设置后续检测间隔的参数.但是通过并行计算这种不同的算法,我可以大大提高效率.