小编Alf*_*ano的帖子

NonExistentClass 无法转换为 Annotation

我向我的项目添加了一个新的 Retrofit 接口,其中包含几个用@GET和注释注释的端点,在使用所述类的构造函数中的注释@HEADERS将所述接口注入到存储库类后,Android Studio 抛出此错误:@Inject

NonExistentClass cannot be converted to Annotation
Run Code Online (Sandbox Code Playgroud)

查看生成的 Java 代码后,它将@GET@HEADERS注释替换为:

@error.NonExistentClass()
Run Code Online (Sandbox Code Playgroud)

我已经尝试过以下操作:

  • 使用annotatioProcessor代替kapt

  • 设置jetifier.enabledfalsegradle.properties

  • 在我的文件generateStubs中设置truebuild.gradle

  • 在我的文件correctErrorTypes中设置truebuild.gradle

我在用着:

  • 安卓工作室3.3

  • 科特林 1.3.11

  • 匕首2.21

  • 改造2.3.0

  • 科特林

  • 卡普特

可能是匕首范围的问题吗?或者Retrofit/dagger 与新版本的Kapt 插件不完全兼容?

android dagger-2 retrofit2 kapt

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

java.lang.IllegalStateException:CameraX尚未初始化

我正在关注有关CameraX的Google Codelab

当我涉及添加“摄像机预览”的部分时,我会这样做:

val previewConfig = PreviewConfig.Builder().apply {
            setTargetAspectRatio(Rational(1, 1))
            setTargetResolution(Size(640, 640))
            setLensFacing(CameraX.LensFacing.BACK)
        }.build()

        val preview = Preview(previewConfig)

        preview.setOnPreviewOutputUpdateListener { previewOutput ->
            val parent = previewView.parent as ViewGroup
            parent.removeView(previewView)
            parent.addView(previewView, 0)

            previewView.surfaceTexture =     previewOutput.surfaceTexture
        updateTransform()
        }


        CameraX.bindToLifecycle(this, preview)
Run Code Online (Sandbox Code Playgroud)

然后我得到以下错误:

java.lang.ExceptionInInitializerError
        at androidx.camera.core.Preview.<clinit>(Preview.java:55)
        at com.grow.vision.ImagePreviewActivity.startCamera(ImagePreviewActivity.kt:120)
        at com.grow.vision.ImagePreviewActivity.access$startCamera(ImagePreviewActivity.kt:28)
        at com.grow.vision.ImagePreviewActivity$onCreate$1.run(ImagePreviewActivity.kt:140)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7032)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
     Caused by: java.lang.IllegalStateException: CameraX not initialized yet.
        at androidx.camera.core.CameraX.getCameraDeviceSurfaceManager(CameraX.java:485)
        at androidx.camera.core.CameraX.getSurfaceManager(CameraX.java:282)
        at androidx.camera.core.Preview$Defaults.<clinit>(Preview.java:416)
        at androidx.camera.core.Preview.<clinit>(Preview.java:55)
Run Code Online (Sandbox Code Playgroud)

似乎我需要以某种方式初始化CameraX,但是代码实验室或CameraX文档均未引用类似的内容。 …

android android-camerax

5
推荐指数
1
解决办法
507
查看次数

java.lang.NoClassDefFoundError:解析失败:Landroidx/arch/core/util/Cancellable

我将我的应用程序项目拆分为其他模块,在实现 DI 并在模块之间拆分依赖项后,出现以下异常:

java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/arch/core/util/Cancellable;
        at androidx.activity.ComponentActivity.<init>(ComponentActivity.java:69)
        at androidx.fragment.app.FragmentActivity.<init>(FragmentActivity.java:118)
        at androidx.appcompat.app.AppCompatActivity.<init>(AppCompatActivity.java:77)
Run Code Online (Sandbox Code Playgroud)

然后,我检查ComponentActivity班级,是的,说班级找不到Cancellable班级。

package androidx.activity;  

import static android.os.Build.VERSION.SDK_INT;  

import android.os.Build;  
import android.os.Bundle;  
import android.view.View;  
import android.view.Window;  

import androidx.annotation.CallSuper;  
import androidx.annotation.ContentView;  
import androidx.annotation.LayoutRes;  
import androidx.annotation.NonNull;  
import androidx.annotation.Nullable;  
import androidx.arch.core.util.Cancellable; // <---- This class can't be found!
import androidx.lifecycle.GenericLifecycleObserver;  
import androidx.lifecycle.Lifecycle;  
import androidx.lifecycle.LifecycleOwner;  
import androidx.lifecycle.LifecycleRegistry;  
import androidx.lifecycle.ReportFragment;  
import androidx.lifecycle.ViewModelStore;  
import androidx.lifecycle.ViewModelStoreOwner;  
import androidx.savedstate.SavedStateRegistry;  
import androidx.savedstate.SavedStateRegistryController;  
import androidx.savedstate.SavedStateRegistryOwner;  

import java.util.WeakHashMap;  

/**  
 * Base class for activities that …
Run Code Online (Sandbox Code Playgroud)

android androidx

5
推荐指数
1
解决办法
2417
查看次数

检查数组是否包含Java值的最有效方法?

我对Java类中的方法有一个类似的逻辑(不是真正的代码,为了示例目的,这是简化的).

private Boolean method(Boolean booleanValue, SomeObject object) {
  return booleanValue ? Arrays.asList(object.getStringsArray()).contains("string") : false;
}
Run Code Online (Sandbox Code Playgroud)

指派自己检查PR的合作者给出了以下评论:

这是低效的.它正在创建一个新的数据结构,只是迭代它并检查是否有某个字符串.

getStringsArray()方法返回一个String[],所以使用for循环会比Arrays.asList()

哪种方式更有效地实现这一目标?

java list data-structures

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

单元测试AndroidViewModel类

我正在为我的应用程序编写单元测试,并且在写入时我发现了"减速带".在测试AndroidViewModel的子类时,我缺少用于初始化的Application参数.我已经读过这个使用Robolectric的问题了.

这是我到目前为止已经尝试过的:

  • 使用Robolectric作为问题描述.据我所知,Robolectric可以使用您的自定义Application类进行测试,我不使用自定义应用程序类,因为我不需要它.(应用程序并不复杂).
  • 使用mockito.Mockito抛出一个异常,说不能模拟Context类.
  • 使用InstrumentationRegistry.我将测试类从测试文件夹移动到androidTest文件夹,让我访问androidTestImplementation依赖项,我尝试使用InstrumentationRegistry.getContext()并将其解析为Application,当然这没有用,抛出一个强制转换异常.我觉得这样愚蠢,但又一次,值得一试.

我只是想实现我的AndroidViewModel类,所以我可以调用它们的公共方法,但是需要Application参数.我能为此做些什么?

fun someTest() {
   val testViewModel = MyViewModelThatExtendsFromAndroidViewModel(**missing application parameter**)
   testViewModel.foo() // The code never reaches here as the testViewModel cant be initializated
}
Run Code Online (Sandbox Code Playgroud)

android unit-testing

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