小编Cod*_*meo的帖子

如何从后台服务和更新UI更新ViewModel的LiveData

最近我正在探索谷歌最近推出的Android架构.从文档中我发现了这个:

public class MyViewModel extends ViewModel {
    private MutableLiveData<List<User>> users;
    public LiveData<List<User>> getUsers() {
        if (users == null) {
            users = new MutableLiveData<List<Users>>();
            loadUsers();
        }
        return users;
    }

    private void loadUsers() {
        // do async operation to fetch users
    }
}
Run Code Online (Sandbox Code Playgroud)

活动可以按如下方式访问此列表:

public class MyActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
        model.getUsers().observe(this, users -> {
            // update UI
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在loadUsers()我正在异步获取数据的函数中,我将首先检查数据库(Room)中的数据,如果我没有得到数据,我将进行API调用以从Web服务器获取数据.然后我将获取的数据插入数据库(Room)并根据数据更新UI.建议的方法是什么?

如果我开始ServiceloadUsers()方法中调用API ,我该如何更新MutableLiveData<List<User>> users …

android background-service viewmodel android-room android-architecture-components

80
推荐指数
3
解决办法
5万
查看次数

使用WorkManager在特定时间安排工作

WorkManager是一个用于排队工作的库,保证在满足约束条件后执行.

因此,在通过Constraints类之后,我没有找到任何函数来为工作添加时间约束.例如,我想在上午8:00开始工作(工作可以是OneTimeWorkRequestPeriodicWorkRequest中的任何一种).如何使用WorkManager添加约束来安排此工作.

android android-workmanager

37
推荐指数
4
解决办法
1万
查看次数

LiveData.getValue()在Room中返回null

Java POJO对象

public class Section {

    @ColumnInfo(name="section_id")
    public int mSectionId;

    @ColumnInfo(name="section_name")
    public String mSectionName;

    public int getSectionId() {
        return mSectionId;
    }

    public void setSectionId(int mSectionId) {
        this.mSectionId = mSectionId;
    }

    public String getSectionName() {
        return mSectionName;
    }

    public void setSectionName(String mSectionName) {
        this.mSectionName = mSectionName;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的查询方法

@Query("SELECT * FROM section")
LiveData<List<Section>> getAllSections();
Run Code Online (Sandbox Code Playgroud)

访问数据库

final LiveData<List<Section>> sections = mDb.sectionDAO().getAllSections();
Run Code Online (Sandbox Code Playgroud)

在下一行,我正在检查sections.getValue()哪个总是给我null,虽然我在DataBase中有数据,后来我得到了onChanged()方法中的值.

sections.observe(this, new Observer<List<Section>>() {
    @Override
    public void onChanged(@Nullable List<Section> sections){

    }
});
Run Code Online (Sandbox Code Playgroud)

但是当我从查询中省略LiveData时,我正在按预期获取数据.查询方法:

@Query("SELECT * …
Run Code Online (Sandbox Code Playgroud)

android android-room android-livedata android-architecture-components

23
推荐指数
2
解决办法
2万
查看次数

在 Kotlinx 序列化中将字段设置为可选

这是我的 pojo 类

@Serializable
data class Response(
    @SerialName("message") val message: String?,
    @SerialName("parameters") val parameters: Map<String, String>?
)
Run Code Online (Sandbox Code Playgroud)

这是 Json,我试图从以下位置解码:

{
   "message": "Some text"
}
Run Code Online (Sandbox Code Playgroud)

此处,该字段parameters是可选的。当我尝试解码时

Json.decodeFromString<Response>(response)
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

kotlinx.serialization.MissingFieldException:序列名“Response”的类型需要字段“parameters”,但它丢失了

我期待将该字段设置parametersnull,如果该字段在Json

parsing android json kotlin kotlinx.serialization

11
推荐指数
1
解决办法
6332
查看次数

如何在可组合项中获取意图数据

当我启动 时Activity,我将一些数据传递给。它通过Intent. 如何从可组合项内的 Intent 访问此数据?

我正在寻找一种直接Intent从可组合项访问的方法。

android-intent android-jetpack-compose

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

在 KMM 中定义全局配置变量

在原生 android 项目中,我们可以定义 BuildConfig 变量,这些变量可以根据所选的构建类型(调试或发布)进行更改。为此,我们可以在应用程序级 gradle 文件中添加以下代码

buildTypes {
    release {
        buildConfigField 'String', "BASE_URL", '"https://stackoverflow.com/"'
    }
    debug {
        buildConfigField 'String', "BASE_URL", '"https://qa.stackoverflow.com/"'
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待创建这样的全局配置变量,可以从共享模块以及 Android 和 iOS 模块(如果可能的话)访问。我怎样才能做到这一点?

gradle-kotlin-dsl kotlin-multiplatform kmm

8
推荐指数
1
解决办法
2685
查看次数

使用ItemTouchHelper.Callback在项目拖动上滚动recyclelerview

当项目部分在屏幕外时,ItemTouchHelper.Callback默认调用interpolateOutOfBoundsScroll.但是,当项目逐渐拖动到屏幕底部时,如何滚动回收器视图.

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {

    public static final float ALPHA_FULL = 1.0f;

    private final ItemTouchHelperAdapter mAdapter;
    private boolean isElevated;

    public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
        mAdapter = adapter;
    }

    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        // Set movement flags based on the layout manager
        if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            final int …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview itemtouchhelper

6
推荐指数
0
解决办法
1382
查看次数