Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将MainActivity转换为Kotlin后,后续生成上的ClassNotFoundException_Android_Classnotfoundexception_Kotlin - Fatal编程技术网

Android 将MainActivity转换为Kotlin后,后续生成上的ClassNotFoundException

Android 将MainActivity转换为Kotlin后,后续生成上的ClassNotFoundException,android,classnotfoundexception,kotlin,Android,Classnotfoundexception,Kotlin,我想尝试一下Kotlin,所以我决定尝试将我的项目中的一个类转换为Kotlin,并在转换整个项目之前查看它如何与我的工作流集成。我能够构建并且我的应用程序可以正常工作,但是在第一次构建之后的每个后续构建中,我都会从ClassLoader获得以下异常。该应用程序只有在清洁后才能正常工作,在我转换任何东西之前工作正常。我能够在同一台机器上多次运行HelloWorld项目而不会出错。这一问题的答复无助于: 有人知道为什么我的应用程序可以在第一个版本上运行,但不能在后续版本上运行吗?这是我的build.

我想尝试一下Kotlin,所以我决定尝试将我的项目中的一个类转换为Kotlin,并在转换整个项目之前查看它如何与我的工作流集成。我能够构建并且我的应用程序可以正常工作,但是在第一次构建之后的每个后续构建中,我都会从ClassLoader获得以下异常。该应用程序只有在清洁后才能正常工作,在我转换任何东西之前工作正常。我能够在同一台机器上多次运行HelloWorld项目而不会出错。这一问题的答复无助于:

有人知道为什么我的应用程序可以在第一个版本上运行,但不能在后续版本上运行吗?这是我的build.gradle、清单和活动,供参考

build.gradle(应用程序模块)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ddiehl.android.htn" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:name="com.ddiehl.android.htn.HoldTheNarwhal"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:supportsRtl="true">

        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity
            android:name="com.ddiehl.android.htn.view.activities.MainActivity"
            android:label="@string/app_name"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="www.damiendiehl.net"
                    android:scheme="http" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.kt(我编辑了大部分与视图相关的逻辑,它有400行,目前这是一个封闭源代码项目。不过,如果需要,我可以粘贴完整的文件)

package com.ddiehl.android.htn.view.activities
导入android.app.Dialog
导入android.app.ProgressDialog
导入android.os.AsyncTask
导入android.os.Build
导入android.os.Bundle
导入android.support.design.widget.NavigationView
导入android.support.design.widget.Snackbar
导入android.support.v4.content.ContextCompat
导入android.support.v4.view.GravityCompat
导入android.support.v4.widget.DrawerLayout
导入android.support.v7.app.AppActivity
导入android.support.v7.widget.Toolbar
导入android.view.MenuItem
导入android.view.view
导入android.view.Window
导入android.widget.EditText
导入android.widget.ImageView
导入android.widget.TextView
进口毛刀,捆扎
进口毛刀
导入butterknife.OnClick
导入butterknife.bindView
导入com.flurry.android.FlurryAgent
导入com.flurry.android.FlurryAgentListener
导入com.mopub.common.mopub
导入com.mopub.mobileads.MoPubConversionTracker
导入hugo.weaving.DebugLog
导入java.util.HashMap
导入kotlin.properties.Delegates
公共类MainActivity:AppCompatActivity(),MainView,ConfirmSignOutDialog.Callbacks,NavigationView.OnNavigationItemSelectedListener{
private val mBus=BusProvider.getInstance()
私有变量mMainPresenter:MainPresenter?=null
私有变量mLastAuthCode:字符串?=null
私有变量mProgressBar:ProgressDialog?=null
私有变量mSubredditNavigationDialog:Dialog?=null
val mDrawerLayout:bindView的抽屉布局(R.id.drawer\U布局)
私有变量mAccessTokenManager:AccessTokenManager?=null
调试日志
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
黄油刀(this@MainActivity)
Init().execute()
}
私有内部类Init:AsyncTask(){
覆盖乐趣onPreExecute(){
super.onPreExecute()
mNavigationView.setNavigationItemSelectedListener(this@MainActivity)
val toolbar=ButterKnife.findById(this@MainActivity,R.id.toolbar)
设置支持操作栏(工具栏)
val actionBar=getSupportActionBar()
if(actionBar!=null){
actionBar.setHomeAsUpIndicator(R.drawable.ic_导航_菜单)
actionBar.setDisplayHomeAsUpEnabled(真)
}
}
覆盖乐趣doInBackground(vararg参数:Void):Void{
mAccessTokenManager=AccessTokenManager.getInstance(this@MainActivity)
返回空
}
重写onPostExecute(避免:无效?){
super.onPostExecute(避免)
onAppInitialized()
}
}
覆盖有趣的onStart(){
super.onStart()
如果(mAccessTokenManager==null){
showSpinner(R.string.application\u加载)
}否则{
onAppInitialized()
}
}
私人娱乐已初始化(){
小型企业单位登记册(mAccessTokenManager)
FlurryAgent.onStartSession(此)
dismissSpinner()
updateUserIdentity()
showSubredditIfEmpty(空)
}
覆盖桌面上的乐趣(){
super.onStop()
FlurryAgent.onEndSession(本)
mBus.注销(mAccessTokenManager)
}
伴星{
public val标记:String=javaClass().getSimpleName()
私人val对话框\u确认\u注销=“对话框\u确认\u注销”
私有val FLURRY_会话_超时_秒=30
}
}

一个可能的原因可能是注释处理库。

将现有Android应用程序从Java转换为Konlin时,需要进行许多配置更改。如果您只将实际的Java文件转换为Kotlin,那么编译就可以了,但是您会得到那些运行时加载错误。 最简单的方法是将Kotlin类添加到项目中:

新建->kotlin类/文件


Android studio随后将进行所有必要的设置,以支持kotlin。在您可以删除新类之后

感谢您的回复,这很可能就是原因所在。根据我发布这个问题时的构建脚本,看起来我是在无意中同时尝试使用ButterKnife(及其Kotlin等价物Kotterknife)。不幸的是,由于我放弃了将该项目转换为Kotlin的尝试,我无法验证这是否是真正的原因:(永远不要放弃将Java项目转换为Kotlin!以后会有回报的。)如果我添加以下行:
apply plugin:“Kotlin android”,我就能够启动MainActivityKotlin.kt
到应用程序
build.gradle
文件。没有这一行,我会得到同样的错误。请注意,“为项目配置Kotlin”
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.jakewharton.hugo'
apply plugin: 'com.getkeepsafe.dexcount'
apply plugin: 'me.tatarka.retrolambda'

android {
    compileSdkVersion 22
    buildToolsVersion "23 rc3"
    defaultConfig {
        applicationId "com.ddiehl.android.htn"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 4
        versionName "0.3.0-dev"
        ndk {
            moduleName "app"
        }
    }
    signingConfigs {
        release {
            storeFile file(ANDROID_KEYSTORE_PATH)
            storePassword ANDROID_KEYSTORE_PWD
            keyAlias HTN_KEYSTORE_ALIAS
            keyPassword HTN_KEYSTORE_PWD
        }
    }
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
            minifyEnabled false
        }

        release {
            debuggable false
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
        debug.java.srcDirs += 'src/debug/kotlin'
    }
}

def getLocalProperty(s) {
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    return properties.getProperty(s)
}

retrolambda {
    jdk getLocalProperty("jdk8.dir")
}

dependencies {
    compile project(':reddit')
    compile project(':mopub')
    compile project(':flurry')
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.android.support:support-v4:22.2.1'
    compile 'com.android.support:design:22.2.0'
    compile 'com.android.support:recyclerview-v7:22.2.1'
    compile 'com.android.support:cardview-v7:22.2.1'
    compile 'com.google.android.gms:play-services-ads:7.5.0'
    compile 'com.squareup.okhttp:okhttp:2.4.0'
    compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0'
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    compile 'com.squareup:otto:1.3.5'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.jakewharton:butterknife:7.0.0'
    compile 'com.jakewharton:kotterknife:0.1.0-SNAPSHOT'
    compile 'io.reactivex:rxandroid:0.25.0'
    compile 'com.facebook.stetho:stetho:1.1.1'
    compile 'com.facebook.stetho:stetho-okhttp:1.1.1'
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
}

buildscript {
    ext.kotlin_version = '0.12.1230'
    repositories {
        mavenCentral()
        maven {
            url 'http://oss.sonatype.org/content/repositories/snapshots'
        }
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

repositories {
    mavenCentral()
    maven {
        url 'http://oss.sonatype.org/content/repositories/snapshots'
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ddiehl.android.htn" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:name="com.ddiehl.android.htn.HoldTheNarwhal"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:supportsRtl="true">

        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity
            android:name="com.ddiehl.android.htn.view.activities.MainActivity"
            android:label="@string/app_name"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="www.damiendiehl.net"
                    android:scheme="http" />
            </intent-filter>
        </activity>
    </application>

</manifest>
package com.ddiehl.android.htn.view.activities

import android.app.Dialog
import android.app.ProgressDialog
import android.os.AsyncTask
import android.os.Build
import android.os.Bundle
import android.support.design.widget.NavigationView
import android.support.design.widget.Snackbar
import android.support.v4.content.ContextCompat
import android.support.v4.view.GravityCompat
import android.support.v4.widget.DrawerLayout
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.MenuItem
import android.view.View
import android.view.Window
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
import butterknife.Bind
import butterknife.ButterKnife
import butterknife.OnClick
import butterknife.bindView
import com.flurry.android.FlurryAgent
import com.flurry.android.FlurryAgentListener
import com.mopub.common.MoPub
import com.mopub.mobileads.MoPubConversionTracker
import hugo.weaving.DebugLog
import java.util.HashMap
import kotlin.properties.Delegates

public class MainActivity : AppCompatActivity(), MainView, ConfirmSignOutDialog.Callbacks, NavigationView.OnNavigationItemSelectedListener {

    private val mBus = BusProvider.getInstance()
    private var mMainPresenter: MainPresenter? = null
    private var mLastAuthCode: String? = null

    private var mProgressBar: ProgressDialog? = null
    private var mSubredditNavigationDialog: Dialog? = null

    val mDrawerLayout: DrawerLayout by bindView(R.id.drawer_layout)

    private var mAccessTokenManager: AccessTokenManager? = null

    DebugLog
    override fun onCreate(savedInstanceState: Bundle?) {
        super<AppCompatActivity>.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ButterKnife.bind(this@MainActivity)

        Init().execute()
    }

    private inner class Init : AsyncTask<Void, Void, Void>() {
        override fun onPreExecute() {
            super.onPreExecute()

            mNavigationView.setNavigationItemSelectedListener(this@MainActivity)

            val toolbar = ButterKnife.findById<Toolbar>(this@MainActivity, R.id.toolbar)
            setSupportActionBar(toolbar)
            val actionBar = getSupportActionBar()
            if (actionBar != null) {
                actionBar.setHomeAsUpIndicator(R.drawable.ic_navigation_menu)
                actionBar.setDisplayHomeAsUpEnabled(true)
            }
        }

        override fun doInBackground(vararg params: Void): Void? {
            mAccessTokenManager = AccessTokenManager.getInstance(this@MainActivity)
            return null
        }

        override fun onPostExecute(aVoid: Void?) {
            super.onPostExecute(aVoid)
            onAppInitialized()
        }
    }

    override fun onStart() {
        super<AppCompatActivity>.onStart()

        if (mAccessTokenManager == null) {
            showSpinner(R.string.application_loading)
        } else {
            onAppInitialized()
        }
    }

    private fun onAppInitialized() {
        mBus.register(mAccessTokenManager)

        FlurryAgent.onStartSession(this)
        dismissSpinner()
        updateUserIdentity()
        showSubredditIfEmpty(null)
    }

    override fun onStop() {
        super<AppCompatActivity>.onStop()
        FlurryAgent.onEndSession(this)
        mBus.unregister(mAccessTokenManager)
    }

    companion object {
        public val TAG: String = javaClass<MainActivity>().getSimpleName()

        private val DIALOG_CONFIRM_SIGN_OUT = "dialog_confirm_sign_out"
        private val FLURRY_SESSION_TIMEOUT_SECONDS = 30
    }

}