标签: android-architecture-components

房间持久性@Relation在Java工作,但在Kolin工作

基于我之前的问题(Android持久性空间:"无法弄清楚如何从光标读取此字段")我得到了工作,感谢反馈,我在Kolin中实现了相同的示例(请参阅下面的代码).我不得不做一些小改动,比如现在传递给查询的参数必须作为"p0","p1"等传递.现在在Kotlin中我得到以下与UserWithPets类相关的错误:

错误:无法弄清楚如何从游标中读取此字段.e:private java.util.List pets;

@Dao
interface UserDAO {   

    @get:Query("SELECT * FROM user")
    val all: LiveData<List<User>>

    @Insert
    fun insertUser(user: User) //single one

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertUsers(vararg users: User)

    @Query("SELECT * FROM User")
    fun loadUsersWithPets(): LiveData<List<UserWithPets>>

}


@Entity
class Pet( var name: String?,  var ownerId: Int,@PrimaryKey(autoGenerate = true)var id:Int)



@Dao
interface PetDAO {
    @Query("SELECT * FROM pet")
    val all: List<Pet>

    @Query("SELECT * FROM pet WHERE id IN (:p0)")
    fun loadAllByIds(petIds: IntArray): List<Pet>


    @Insert
    fun insert(pet: Pet)

    @Insert
    fun insertAll(vararg …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-room android-architecture-components

10
推荐指数
1
解决办法
1381
查看次数

如何使用体系结构组件分页库停止在回收器视图上闪烁

我有一个类似聊天的活动,我使用带有PagedListAdaper的RecyclerView来加载一堆消息.我正在使用PositionalDataSource来加载数据.加载它的自我工作正常但是当我发送消息时,我使我的数据源无效并且列表被重新制作.我的问题是,当它这样做时它会闪烁:

这就是它的样子

我尝试添加setHasStableIds(true)并重写getItemId,它可以在一个简单的适配器上工作,但它似乎在这里不起作用.我似乎也无法将项添加到getCurrentList(),因为它不受支持.此外,我没有使用数据库,只是向服务器发出请求.

所以我的问题是,除了使数据源失效之外,还有更好的方法吗?有没有办法阻止列表在发送消息时闪烁?或者这个图书馆不适合我的聊天活动?

编辑:

我的差异回调

private val DIFF_CALLBACK: DiffCallback<MessageModel> = object : DiffCallback<MessageModel>() {
        override fun areItemsTheSame(@NonNull oldMessage: MessageModel, @NonNull newMessage: MessageModel) =
                oldMessage.id == newMessage.id


        override fun areContentsTheSame(@NonNull oldMessage: MessageModel, @NonNull newMessage: MessageModel) =
                oldMessage.equals(newMessage)
    }
Run Code Online (Sandbox Code Playgroud)

Edit2我修复了它:

所以我设法通过使用PagedListAdapterHelper并在加载项目后设置它的列表来修复它:

private var mHelper: PagedListAdapterHelper<MessageModel>? = null

init {
    mHelper = PagedListAdapterHelper(this, DIFF_CALLBACK)
    setHasStableIds(true)
}
fun setList(pagedList: PagedList<MessageModel>) {
    pagedList.addWeakCallback(pagedList.snapshot(), object:PagedList.Callback() {
        override fun onChanged(position: Int, count: Int) {

        }

        override fun onInserted(position: Int, count: Int) {
            mHelper?.setList(pagedList) …
Run Code Online (Sandbox Code Playgroud)

android android-architecture-components android-paging

10
推荐指数
1
解决办法
1734
查看次数

对于在库模块中定义的POJO的@NonNull带注释的构造函数参数,Android Room @Embedded批注编译失败

我有一个POJO,我将其嵌入房间实体; 请注意,POJO在库模块中定义 ;

@Entity
public class Person {
    @PrimaryKey
    @NonNull
    private String uuid;

    @Embedded
    @NonNull
    private Address address;

    public Person(@NonNull String uuid, @NonNull Address address) {
        this.uuid = uuid;
        this.address = address;
    }

    @NonNull
    public String getUuid() {
        return uuid;
    }

    @NonNull
    public Address getAddress() {
        return address;
    }
}


public class Address {
    @NonNull
    private String street;

    @NonNull
    private String city;

    public Address(@NonNull String street, @NonNull String city) {
        this.street = street;
        this.city = city;
    }

    @NonNull
    public …
Run Code Online (Sandbox Code Playgroud)

android android-room android-architecture-components

10
推荐指数
1
解决办法
1848
查看次数

我们什么时候应该使用android.arch.lifecycle:compiler(或android.arch.lifecycle:common-java8)?

目前,我们正在使用LiveDataViewModelRoom在我们的项目。

我们正在使用Java 8。

我们在下面使用 build.gradle

// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"

// Room (use 1.1.0-beta1 for latest beta)
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
Run Code Online (Sandbox Code Playgroud)

我想知道我们什么时候需要使用

annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
Run Code Online (Sandbox Code Playgroud)

(或者implementation "android.arch.lifecycle:common-java8:1.1.1"因为我们正在使用Java 8 ?!)

目前,我们的代码可以正常运行,而无需使用lifecycle:compilerlifecycle:common-java8

android android-architecture-components

10
推荐指数
4
解决办法
4627
查看次数

如何在androidTest上正确模拟ViewModel

我目前正在写一些UI单元测试片段,其中之一@Test是看是否显示正确的对象列表,这是不是一个集成测试,所以我想嘲笑ViewModel.

片段的变量:

class FavoritesFragment : Fragment() {

    private lateinit var adapter: FavoritesAdapter
    private lateinit var viewModel: FavoritesViewModel
    @Inject lateinit var viewModelFactory: FavoritesViewModelFactory

    (...)
Run Code Online (Sandbox Code Playgroud)

这是代码:

@MediumTest
@RunWith(AndroidJUnit4::class)
class FavoritesFragmentTest {

    @Rule @JvmField val activityRule = ActivityTestRule(TestFragmentActivity::class.java, true, true)
    @Rule @JvmField val instantTaskExecutorRule = InstantTaskExecutorRule()

    private val results = MutableLiveData<Resource<List<FavoriteView>>>()
    private val viewModel = mock(FavoritesViewModel::class.java)

    private lateinit var favoritesFragment: FavoritesFragment

    @Before
    fun setup() {
        favoritesFragment = FavoritesFragment.newInstance()
        activityRule.activity.addFragment(favoritesFragment)
        `when`(viewModel.getFavourites()).thenReturn(results)
    }

    (...)

    // This is …
Run Code Online (Sandbox Code Playgroud)

android mockito kotlin android-espresso android-architecture-components

10
推荐指数
3
解决办法
6629
查看次数

使用WorkManager定期每日工作请求

如何正确使用WorkManagerAndroid Jetpack中的新功能来安排每天一次的定期工作,这应该每天做一次并且只做一次?

我们的想法是检查具有给定标签的工作是否已经存在WorkManager,否则开始新的定期工作.

我尝试使用下一种方法来做到这一点:

public static final String CALL_INFO_WORKER = "Call worker";

...

WorkManager workManager = WorkManager.getInstance();
List<WorkStatus> value = workManager.getStatusesByTag(CALL_INFO_WORKER).getValue();
if (value == null) {
    WorkRequest callDataRequest = new PeriodicWorkRequest.Builder(CallInfoWorker.class,
                24, TimeUnit.HOURS, 3, TimeUnit.HOURS)
                .addTag(CALL_INFO_WORKER)
                .build();
    workManager.enqueue(callDataRequest);
}
Run Code Online (Sandbox Code Playgroud)

value总是空,即使我把一个断点里面WorkerdoWork()方法(所以它肯定是正在进行中),并从另一个线程检查工作状态.

android android-architecture-components android-jetpack android-workmanager

10
推荐指数
2
解决办法
8472
查看次数

WorkerManager是一种在应用程序中实现警报/提醒功能的可行方法吗?

我们注意到AlarmManagerCompat,由于AlarmManager不同版本的操作系统中的行为不同,仅在我们的应用程序中实现警报/提醒功能并不是一种可靠的方法.(例如,打盹模式)

最初,我们计划使用Evernote的android-job库来帮助我们在应用程序中实现警报/提醒功能.

但是,在此过程中,我们也注意到谷歌刚刚发布WorkerManager.

到目前为止,WorkerManager当我们在应用程序退出后运行一些一次性后台作业(几乎是即时的,具有互联网连接约束)时,对我们来说效果很好.

我们计划使用WorkerManager实现警报/提醒功能.

我想知道,WorkerManager实现这样的功能有多可靠?有人尝试过吗?我们的目标是API 15及更高版本.

android android-architecture-components android-workmanager

10
推荐指数
1
解决办法
1714
查看次数

我如何在NavHostFragment中检索当前片段?

我试图在新的导航组件中找到一个方法,但我没有找到任何相关的方法.

我目前的目的地是:

mainHostFragment.findNavController().currentDestination
Run Code Online (Sandbox Code Playgroud)

但我无法获得任何对显示片段的引用.

android android-fragments kotlin android-architecture-components android-architecture-navigation

10
推荐指数
6
解决办法
7282
查看次数

在没有LifecycleOwner的自定义视图中设置LiveData观察器

我正在尝试使用新的Android架构组件,并且在尝试将MVVM模型用于自定义视图时遇到了障碍.

基本上我已经创建了一个自定义视图来封装一个公共UI,它是在整个应用程序中使用的相应逻辑.我可以在自定义视图中设置ViewModel但是我必须在自定义视图中使用observeForever()或手动设置LifecycleOwner如下所示,但似乎都不正确.

选项1)使用 observeForever()

活动

class MyActivity : AppCompatActivity() {

    lateinit var myCustomView : CustomView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myCustomView = findViewById(R.id.custom_view)
        myCustomView.onAttach()
    }

    override fun onStop() {
        myCustomView.onDetach()
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义视图

class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){

    private val viewModel = CustomViewModel()

    fun onAttach() {
        viewModel.state.observeForever{ myObserver }
    }

    fun onDetach() {
        viewModel.state.removeObserver{ myObserver }
    }
}
Run Code Online (Sandbox Code Playgroud)

选项2)从Activity`设置lifecycleOwner

活动

class MyActivity : AppCompatActivity() {

    lateinit var myCustomView : CustomView

    override fun onCreate(savedInstanceState: …
Run Code Online (Sandbox Code Playgroud)

android mvvm android-livedata android-viewmodel android-architecture-components

10
推荐指数
1
解决办法
3574
查看次数

将参数传递给嵌套的导航体系结构组件图

如何将参数传递给嵌套的Navigation体系结构组件图?

假设我构造了导航图以从导航FragmentA --> Nested,其中Nested包含FragmentB --> FragmentC...

如果这是一个纯FragmentA --> FragmentB...图形,我将使用设置导航FragmentADirections.actionFragmentAToFragmentB(argument = foo)。但是,一旦您B --> C变成Nested... ,该操作就会采用零参数。

那我该怎么办?

android android-architecture-components android-architecture-navigation

10
推荐指数
1
解决办法
2450
查看次数