标签: android-architecture-components

如何在使用实时数据时链接Android中的转换?

鉴于以下设置:

我有2个存储库:存储库A存储库B它们都返回实时数据.

我有一个使用这两个存储库的ViewModel.

我想从Repository A中提取一些内容,并根据结果我想从Repository B中获取一些东西,然后在返回UI之前转换结果.

为此我一直在看LiveData Transformation类.这些例子显示了结果的单一转换,但是我想要链接两个转换的行.我怎么能做到这一点?

我尝试过像这样设置但在第二个转换块上出现类型不匹配:

  internal val launchStatus: LiveData<String> = Transformations
        .map(respositoryA.getData(), { data ->
            if (data.isValid){
                "stringA"
            } else {
                //This gives a type mismatch for the entire block
                Transformations.map(repositoryB.getData(), {
                    result -> result.toString()
                })
            }
        })
Run Code Online (Sandbox Code Playgroud)

(另请告诉我是否有替代/推荐的方法来抓取链接这些呼叫的东西,即从A抓取一些东西然后根据A的结果从B中抓取一些东西,依此类推)

android kotlin android-livedata android-architecture-components

11
推荐指数
2
解决办法
6096
查看次数

使用自定义DataSource的分页库不会更新Room更新中的行

我一直在使用RecyclerView实现新的Paging Library,其中应用程序构建在Architecture Components之上.

填充列表的数据来自Room数据库.实际上,它是从网络中获取的,存储在本地数据库中并提供给列表.

为了提供构建列表所需的数据,我实现了自己的自定义PageKeyedDataSource.一切都按预期工作,除了一个小细节.显示列表后,如果列表行元素的数据发生任何更改,则不会自动更新.因此,例如,如果我的列表显示了具有字段名称的项目列表,并且突然,该字段在本地Room数据库中针对特定行项目更新,则列表不会自动更新行UI.

仅当使用自定义DataSource时才会发生此行为,这与通过直接返回DataSource FactoryDAO自动获取DataSource不同.但是,我需要实现自定义DataSource.

我知道可以通过调用DataSource上的invalidate()方法来重新更新列表来更新它.但是,如果应用程序一次显示2个列表(例如每个半屏),并且此项目出现在两个列表中,则需要分别为两个列表调用invalidate().

我想过一个解决方案,其中,不是使用item的类的实例来填充每个ViewHolder,而是使用它的LiveData包装版本,使每行观察其自己项目的更改并在必要时更新该行UI .不过,我看到这种方法有一些缺点:

  1. 必须将LifeCycleOwner(例如包含RecyclerView的Fragment)传递给PagedListAdapter,然后将其转发到ViewHolder以观察LiveData包装的项目.
  2. 将为每个列表的新行注册一个新的观察者,所以我根本不知道它是否有过多的计算和内存成本,考虑到它将在应用程序中的每个列表中完成,其中包含很多列表.
  3. 例如,观察LiveData包装项的LifeCycleOwner将是包含RecyclerView的Fragment,而不是ViewHolder本身,每当对该项发生更改时,即使包含该项的行不均匀,也会通知观察者.在那一刻可见,因为列表已滚动,这在我看来像浪费资源,可能会不必要地增加计算成本.

我根本不知道,即使考虑到这些缺点,它看起来似乎是一种体面的方法,或者,如果你们中的任何人知道任何其他更清洁和更好的方法来管理它.

先感谢您.

android list android-livedata android-architecture-components android-paging

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

此NavController不知道操作

我以两种不同的方式提供片段之间的数据传输,首先是正常工作,而安全的数据类型会导致运行时崩溃。我正在使用该Android文档:https : //developer.android.com/topic/libraries/architecture/navigation/navigation-implementing#Safe-args

不明白如何解决该问题。谢谢你的帮助

07-13 11:40:07.986 8119-8119/com.flexdecision.ak_lex.navigationsimple E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.flexdecision.ak_lex.navigationsimple, PID: 8119
java.lang.IllegalArgumentException: navigation destination com.flexdecision.ak_lex.navigationsimple:id/transferAction is unknown to this NavController
    at androidx.navigation.NavController.navigate(NavController.java:669)
    at androidx.navigation.NavController.navigate(NavController.java:628)
    at androidx.navigation.NavController.navigate(NavController.java:690)
    at com.flexdecision.ak_lex.navigationsimple.InitialFragment.makeTransfer(InitialFragment.java:58)
    at com.flexdecision.ak_lex.navigationsimple.InitialFragment.lambda$onViewCreated$0(InitialFragment.java:47)
    at com.flexdecision.ak_lex.navigationsimple.-$$Lambda$InitialFragment$shEoLbIe0sVhbTcJ2Al_FvBuU7g.onClick(lambda)
    at android.view.View.performClick(View.java:5198)
    at android.view.View$PerformClick.run(View.java:21147)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Run Code Online (Sandbox Code Playgroud)

导航图:

07-13 11:40:07.986 8119-8119/com.flexdecision.ak_lex.navigationsimple E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.flexdecision.ak_lex.navigationsimple, PID: 8119
java.lang.IllegalArgumentException: navigation destination com.flexdecision.ak_lex.navigationsimple:id/transferAction is unknown to this NavController
    at androidx.navigation.NavController.navigate(NavController.java:669)
    at …
Run Code Online (Sandbox Code Playgroud)

java android android-navigation android-architecture-components android-jetpack

11
推荐指数
2
解决办法
9671
查看次数

ObservableField还是LiveData?哪一个是最好的?

我一直在测试Livedata和AAC.

LiveData和ObservableField之间的核心区别是什么?

哪一个是最好的,何时应该使用另一个?

android android-architecture-components

11
推荐指数
2
解决办法
3328
查看次数

Android workmanager计划的工作人员在任务被杀后丢失

我正在尝试使用新的WorkManager API 1.0.0-alpha06每15分钟运行一次工作.如果我没有错,使用带有PeriodicWorkRequest的工作管理器应该让工作人员彻底查看任务并重新启动电话,但是当我从最近的应用程序中滑动任务时,预定的工作人员会丢失(我等了大约45分钟才看到任何人工人的日志安排15分钟间隔).

这些是我的文件:

MyExampleWorker.java:

public class MyExampleWorker extends Worker{
    public static final String TAG = "MY_EXAMPLE_WORKER";

    @NonNull
    @Override
    public Result doWork() { 
        Log.i(TAG, "Starting background worker");
        // Getting configuration data
        long param1 = getInputData().getLong("param1", 60000);
        String param2 = getInputData().getString("param2");
        String param3 = getInputData().getString("param3");

        PackageManager pckMgr = mContext.getPackageManager();
        ...
        ..
        .
        return Result.SUCCESS;
    }

}
Run Code Online (Sandbox Code Playgroud)

Main.java:一旦应用程序启动,此方法就会触发

@ReactMethod
public void execute() {
    Log.i(TAG, "inside execute, setting up periodic worker in workManager");

    Data inputData = new Data.Builder()
            .putLong("param1", 60000)
            .putString("param2", "something")
            .putString("param3", …
Run Code Online (Sandbox Code Playgroud)

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

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

如何从Android分页组件中的PagedListAdapter中删除项目

我使用Paging with Retrofit从REST API加载Notifications数据列表.

当我按下通知项目的删除按钮时,我调用删除API删除它.PagedListAdapter删除API响应成功后删除它的正确方法是什么?PagedListPagedListAdapter不支持通过索引或对象删除项目.

我试着打电话DataSource.validate()但它从开始重新加载,而不是从当前页面重新加载.

android android-architecture-components android-paging

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

使用ViewModel和DataBinding更新UI

我正在尝试学习View-model android,在我学习的第一阶段我试图通过使用视图模型和数据绑定来更新UI(Textview).在View模型中,我有一个aynctask回调,它将调用REST api调用,我正在输出,但我没有更新textview中的值.

我的viewmodel类

public class ViewModelData extends ViewModel {

private MutableLiveData<UserData> users;

public LiveData<UserData> getUsers() {
    if (users == null) {
        users = new MutableLiveData<UserData>();
        loadUsers();
    }

    return users;
}

public void loadUsers() {
    ListTask listTask =new ListTask (taskHandler);
    listTask .execute();

}

public Handler taskHandler= new Handler() {
    @Override
    public void handleMessage(Message msg) {


        UserData  userData = (UserData) msg.obj;

        users.setValue(userData);
    }
};
Run Code Online (Sandbox Code Playgroud)

}

和主要课程

    public class MainActivity extends AppCompatActivity implements LifecycleOwner {
    private LifecycleRegistry mLifecycleRegistry;
    private TextView fName;
    @Override …
Run Code Online (Sandbox Code Playgroud)

android-databinding android-livedata android-viewmodel android-architecture-components

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

具有即时/(动态)功能模块的导航组件

我正在尝试实现具有动态功能的导航组件

所以结构看起来像这样:

  • 应用程式(dynamicFeatures = []在gradle中包含动态程式)
  • 特征

    • 登录
    • 等等
  • 库-> globalNav

我一直在阅读很多没有成功的方法,因为每个功能都是完全隔离的,如何将它们粘合在一起而不相互依赖

例如,应用程序(app module)以开头,SplashActivity并检查会话状态,所以我的问题是我应该如何启动login_graphhome_graph,在第一种情况下,应在完成身份验证流程后启动主目录?

我目前正在尝试将它们粘合在一起的方式是使用一个globalNav模块(android-library),我发现了一些解决方法:

  • 完整的类路径,这意味着我从className开始意图(不好的是,因为它不是真正可扩展的,并且使得维护PITA成为可能)
Intent().setClassName(context.packageName, className).also { context.startActivity(it) }
Run Code Online (Sandbox Code Playgroud)
  • 深层链接(我想用作导航图的深层链接已包含那些链接),但是由于某种原因,即使只有我的应用程序使用它,它也始终显示“选择完整操作”选择器。

    • 我已经尝试过使用actions与深度链接相同的行为

任何建议将是巨大的:)


PS:我一直在浏览/阅读的一些参考资料:

PSS:如果我找到一个好的解决方案,我会尽力解决这个问题,我将确保也回答。

编辑

对于目前对此尚不支持的任何对此感兴趣的人,您可以在此处加注星标:https : //issuetracker.google.com/issues/132170186

android android-intent android-instant-apps android-architecture-components android-architecture-navigation

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

带有垂直 ScrollView 的 MotionLayout

我正在尝试使用运动布局制作动画,并希望将 scrollView 设置为运动场景 onSwipe Transition 的 targetAnchor,但它不起作用。也许我对 onSwipe 过渡一无所知。

这是我的布局文件

    <androidx.constraintlayout.motion.widget.MotionLayout 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:background="@color/main_background_color"
        app:layoutDescription="@xml/base_scroll_scene">

        <ImageView
            android:id="@+id/background_image"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginBottom="@dimen/scrollable_background_image_margin_bottom"
            android:scaleType="centerCrop"
            android:src="@drawable/lift_bg"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/top_gradient_mask_height"
            android:background="@drawable/top_gradient_mask"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/ski_more_logo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/ski_more_logo_margin_top"
            android:src="@drawable/ic_skimore_logo"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/locked_icon"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_marginTop="@dimen/locked_icon_margin_top"
            android:src="@drawable/ic_lock"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/ski_more_logo" />

        <FrameLayout
            android:id="@+id/bottom_gradient_mask"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:background="@drawable/bottom_gradient_mask"
            app:layout_constraintBottom_toBottomOf="@+id/background_image" />

        <ScrollView
            android:id="@+id/content_scroll_view"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:overScrollMode="never"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent">


            <FrameLayout
                android:id="@+id/content_container_view"
                android:layout_width="match_parent"
                android:clickable="false"
                android:layout_height="match_parent" />


        </ScrollView>
    </androidx.constraintlayout.motion.widget.MotionLayout>
Run Code Online (Sandbox Code Playgroud)

在滚动视图中,我以编程方式添加了一些高度较大的内容,这些内容将是可滚动的。

这是我的动作场景 …

android android-layout android-architecture-components

11
推荐指数
2
解决办法
5376
查看次数

MVVM 中视图和 ViewModel 之间的通信与 LiveData

ViewModel和之间进行通信的正确方法是什么ViewGoogle architecture components使用LiveData视图订阅更改并相应地更新自身,但这种通信不适用于单个事件,例如显示消息、显示进度、隐藏进度等。

有一些像SingleLiveEventGoogle 示例中的hack ,但它仅适用于 1 个观察者。一些开发人员使用EventBus但我认为当项目增长时它会很快失控。

有没有方便正确的实现方式,你是如何实现的?

(也欢迎 Java 示例)

android android-livedata android-architecture-components

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