小编The*_*mer的帖子

使用dagger 2的Android生命周期库ViewModel

我有一个ViewModel类,就像在Architecture指南Connecting ViewModel和repository部分中定义的那样.当我运行我的应用程序时,我得到运行时异常.有谁知道怎么解决这个问题?我应该不注入ViewModel吗?有没有办法告诉使用Dagger创建模型?ViewModelProvider

public class DispatchActivityModel extends ViewModel {

    private final API api;

    @Inject
    public DispatchActivityModel(API api) {
        this.api = api;
    }
}
Run Code Online (Sandbox Code Playgroud)

引起:java.lang.InstantiationException:java.lang.Class在java.lang.Class.newInstance(Native Method)的android.arch.lifeModelProvider $ NewInstanceFactory.create(ViewModelProvider.java:143)中没有零参数构造函数在Android.arch.lifecycle.ViewModelProvider.get上的android.arch.lifecycle.ViewModelProviders $ DefaultFactory.create(ViewModelProviders.java:143)android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:128)(ViewModelProvider.java) :96)com.example.base.BaseActivity.onCreate(BaseActivity.java:65)at com.example.dispatch.DispatchActivity.onCreate(DispatchActivity.java:53)at android.app.Activity.performCreate(Activity.java: 6682)在android.app.Anstrumentation.callActivityOnCreate(Instrumentation.java:1118)的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619)android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727). android.app.ActivityT上的app.ActivityThread.-wrap12(ActivityThread.java)在android.app.ActivityThread.main上的android.os.Handler.dispatchMessage(Handler.java:102)上的android.os.Looper.loop(Looper.java:154)处获取$ H.handleMessage(ActivityThread.java:1478) (ActivityThread.java:6121)

android android-lifecycle dagger-2

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

Android生命周期库:无法添加具有不同生命周期的相同观察者

我有一个正在研究的应用程序,它正在使用生命周期库,但我得到一个IllegalArgumentException,上面写着"无法添加具有不同生命周期的相同观察者"我只在onCreate中添加了观察者,我认为这是安全的.我的大多数观察者都是通过匿名类添加的,我认为这不是问题所在,因为观察者永远不会被回收.一个是使用this:

private GpsState gpsState;

void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getLifecycle().addObserver(gpsState);
    gpsState.observe(this, (state) -> {
        // ...
    });
}
Run Code Online (Sandbox Code Playgroud)

在该示例中,GpsState扩展LiveData以提供GPS的当前状态并且实现LifecycleObserver为能够在达到ON_RESUME状态时刷新某些值.

知道我可能做错了什么吗?

android android-lifecycle

11
推荐指数
3
解决办法
4339
查看次数

在kotlin中模拟伴侣对象功能

我正在使用PowerMock和Roboelectric,并希望模拟一个类的伴随对象函数.当我这样做时,我收到一个错误:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);
Run Code Online (Sandbox Code Playgroud)

我所拥有的基本上是这样的:

open class MockableClass private constructor(context: Context) {

    companion object {

        private val INSTANCE_LOCK = Any()
        private var sInstance: MockableClass? = null

        @JvmStatic
        fun getInstance(context: Context): MockableClass? {
            synchronized(INSTANCE_LOCK) {
                sInstance = (sInstance ?: MockableClass(context).let {
                    if (it.isValid) it
                    else null
                }
            }
            return sInstance
        }
    }

    init {
        // Do some initialization using context...
        // Set isValid to true/false depending …
Run Code Online (Sandbox Code Playgroud)

unit-testing powermock kotlin

7
推荐指数
1
解决办法
4396
查看次数

覆盖 GCC 的 varargs 参数提升

我正在为运行 Cortex-M4 架构的 ARM 处理器编写一段代码(具有单精度浮点数,但不是双精度浮点数)。我遇到的问题是使用可变参数时,编译器尝试将我的浮点数提升为双精度数。有什么办法可以关掉这个功能吗?或者指定不同的促销策略?我查看了 GCC 手册,但找不到任何内容。一个简单的例子是尝试编写自己的 printf...

void myprintf(const char *fmt, ...) {
  // .. parse fmt and come across %f

  double dv = va_arg(args, double); // Compiles but doesn't link

  float fv = va_arg(args, float); // Doesn't compile (warns about promotion)
}
Run Code Online (Sandbox Code Playgroud)

更新:根据要求,我想要使用的呼叫命令是myprintf("%f", 1.0f);。问题是 Cortex-M4 不支持双精度,因此当 1.0f 提升为双精度时......好吧,它不能。因此,使用它将va_arg(args, double)编译但不会链接,因为__aeabi_与双精度相关的各种函数不存在。我想要做的是禁用 GCC 将浮点数提升为双精度(如果可能)。

更新:我有一个当前的解决方法,基本上只接受指向浮点数而不是浮点数的指针。我仍然想禁用促销,因为这不是一个很好的解决方案。

c gcc variadic-functions

6
推荐指数
1
解决办法
432
查看次数

如何在 RecycleView 中正确使用 LiveData

我有一个从服务器加载列表的项目。这些数据最终会存储到数据库中,但目前存储在内存中的 MutableLiveData 中。RecyclerView 的适配器正在监视数据并显示它。到目前为止,一切都按预期工作,使用 FAB,用户可以发布一个新条目,该条目将位于列表顶部,成功后我得到 200,这是我迷路的主要部分......

当我想将单个项目添加到存储在 LiveData 中的列表中时,观察者不知道增量。我目前打电话给RecyclerView.Adapter.notifyDataSetChanged(),尽管在我的情况下理想的是打电话,notifyItemInserted(0)或者在其他情况下我可以看到各种其他通知。这样做的最佳方法是什么?生命周期架构库似乎经过深思熟虑,我想我错过了一些简单的东西。我无法想象必须手动执行列表之间的差异?

android android-recyclerview

5
推荐指数
0
解决办法
930
查看次数

使用 ConstraintLayout 创建背景

我想创建一个类似盒子的东西,其中包含按钮和标签,并具有白色稀松布,通常通过以下方式完成:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_alignParentBottom=true
        android:background="#99ffffff
        android:gravity="center_horizontal">
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button Text"
            android:layout_margin="8dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Label Text"
            android:layout_margin="8dp"/>
    </LinearLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

我所做的是:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <View
        android:id="@+id/scrim
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#99ffffff"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="@+id/button"/>
    <Button
        android:id="@+id/button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/label"/>
    <TextView
        android:id="@+id/label
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

这个想法是创建一个底部约束到父级、顶部约束到按钮顶部的稀松布视图,按钮位于 TextView 顶部,而 TextView 约束于父级底部。

问题在于稀松布不尊重按钮的边距,即稀松布的顶部与按钮的顶部齐平,而不是在其上方 8dp。

android android-constraintlayout

3
推荐指数
1
解决办法
2938
查看次数

Dagger 2 将活动的视图模型注入片段

(使用 kotlin)我有一个应用程序,它使用带有 2 个片段的设置活动。我希望两者都获得与活动相同的 SettingsViewModel 实例。我认为我遗漏了一个范围界定问题。

首先,我有标准ViewModelModule

@Module
abstract class ViewModelModule {
    @Binds @IntoMap
    @ViewModelKey(SettingsViewModel::class)
    abstract fun bindSettingsViewModel(viewModel: SettingsViewModel): ViewModel

    @Binds
    abstract fun bindViewModelFactory(factory: MyViewModelFactory): ViewModelProvider.Factory
}
Run Code Online (Sandbox Code Playgroud)

我将我的活动绑定在:

@Module
abstract class AndroidBindingModule {
    @PerActivity
    @ContributesAndroidInjector(modules = [SettingsActivityModule::class])
    abstract fun contributeSettingsActivity(): SettingsActivity
}
Run Code Online (Sandbox Code Playgroud)

有了所有其他的东西,这工作得很好,并且SettingsActivity确实获得了SettingsViewModel. SettingsActivityModule添加以下内容:

@PerFragment
@ContributesAndroidInjector
abstract fun contributeMainSettingsFragment(): MainSettingsFragment

@PerFragment
@ContributesAndroidInjector
abstract fun contributeDebugSettingsFragment(): DebugSettingsFragment
Run Code Online (Sandbox Code Playgroud)

两个片段似乎都调用了注入器(我已经检查过调试器并被AndroidSupportInjection.inject(fragment)调用)。片段包括:

@Inject lateinit var mainViewModel: SettingsViewModel
Run Code Online (Sandbox Code Playgroud)

但在我的片段中,onCreate()我看到它mainViewModel仍然为空。我需要在这里做什么特别的事情来避免调用ViewModelProviders.of(activity)[SettingsViewModel::class.java]而是注入视图模型?

更新:

阅读更多内容后,我发现在片段中使用视图模型注入的正确方法是注入工厂并获取视图模型 …

android kotlin dagger-2

3
推荐指数
1
解决办法
3293
查看次数

Android 显示动画 WebP

我有一个从原始AR 贴纸 APK 中获取的动画 webp 文件,我想在我的应用程序中显示该文件,以便在 ARCore 中使用。看起来我可以轻松地将 webp 文件的第一帧加载到 imageview 中,但尝试将其解码为Movie对象失败。有没有简单的显示方法?这显然是可能的,因为 AR-Stickers 应用程序在其原始版本中清楚地做到了。我看到 Facebook (Fresco) 的一个库似乎应该能够做到这一点,但据我所知,它为我的应用程序的 APK 增加了相当多的膨胀。是否有任何简单的解决方案?

android webp

2
推荐指数
1
解决办法
4320
查看次数