使用AppCompatActivity时NoClassDefFoundError

时间:2017-04-14 08:04:14

标签: java android android-activity android-appcompat

我在Eclipse上有一个包含许多库项目的项目。然后我将它们移动到Android Studio。经过艰苦的努力,使得gradle建立成功。现在我可以运行我的项目并将apk安装到设备上。但是当我打开一个扩展AppCompatActivity的活动时,我在运行时得到了一个N​​oClassDefFoundError。但是如果我使用Activity而不是AppCompatActivity,则不会发生错误。我在清单中定义了活动。

这是logcat输出:

E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: com.my.packagename.activities.MyActivity
at com.my.packagename.activities.LoginActivity$2.onClick(LoginActivity.java:163)
at android.view.View.performClick(View.java:4475)
at android.view.View$PerformClick.run(View.java:18786)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5493)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
at dalvik.system.NativeStart.main(Native Method)

这是我的活动模块的依赖性:

compile 'com.google.android.gms:play-services-gcm:10.2.1'
compile 'com.android.support:support-v4:24.0.0'
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:design:24.0.0'

我错过了什么?

编辑我的清单文件:

...
<activity
        android:name=".activities.MyActivity"
        android:theme="@style/MyTheme"
        android:label="@string/title_activity_my_activity"/>
</application>

我的样式文件:

 ...
 <style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar"</style>

这是我的活动,它扩展了AppCompatActivity(actullaty是一个非常简单的活动):

public class MyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
    }
}

我打开此活动的代码。我只放了onClick监听器代码,因为整个活动太长了,无法放在这里:

btnSignUp.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (!getIsOnline()) {
            toast.setText(R.string.no_network);
            toast.show();
            return;
        }
        Intent intent = new Intent(getApplicationContext(), MyActivity.class);
        startActivity(intent);
    }
});

确定。我删除了multidex。我把谷歌播放服务只用gcm包,这解决了我的方法计数问题。 gradle构建文件已更新。之后我运行'gradlew clean'和'Invalidate caches / Restart'。但问题还在继续。

3 个答案:

答案 0 :(得分:1)

  • 检查您的主题,应该是Theme.AppCompat.Light.DarkActionBar或某事。

  • 检查您的MyActivity是否存在于清单

  • 检查method count,如果超过65k,请确保使用Multidex

答案 1 :(得分:1)

的build.gradle

应该是更高的gradle版本

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

的build.gradle:

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

         defaultConfig {
             minSdkVersion 14 //lower than 14 doesn't support multidex
             targetSdkVersion 22

             // Enabling multidex support.
             multiDexEnabled true
         }
}

dependencies {
    compile 'com.android.support:multidex:1.0.1'
}

Application.Class

public class MyApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

}

清单:

android:name=".MyApplication" 

更改grade.properties

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

1.尝试文件 - &gt;使缓存无效并重新启动工作室。

2.在默认配置

中添加multiDexEnabled = true
  1. 在依赖项中添加编译com.android.support:multidex:1.0.0

  2. 应用程序类扩展MultiDexApplication而不仅仅是Application

  3. 5.如果上述事情无效,请删除您的gradle并制作一个干净的项目,它将生成一个新的gradle。

答案 2 :(得分:1)

你的build.gradle中的

添加

$polygon = sprintf('POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s))', 
$long_high, $lat_high, $long_low, $lat_high, $long_low, $lat_low, $long_high, $lat_low, $long_high, $lat_high);

$query = "SELECT count, mahkoy_kod , mahkoy_adi, ilce_id, st_x(st_transform(st_centroid(t2.geom),4326)) as lng,st_y(st_transform(st_centroid(t2.geom),4326)) as lat from 
(
  SELECT count(*),t1.knt_f_mahkoy_id FROM a.s_all t1                                             
  where st_intersects(t1.geom,st_transform(ST_GeomFromText( ?, 4326),500000)) 
  group by knt_f_mahkoy_id 
) t1
  join analiz.k_spt_dis_mah_koy t2 on t1.knt_f_mahkoy_id = t2.mahkoy_kod  where  count > 100";

$data = Database::query($query, array($polygon));

并添加您的活动onCreate

defaultConfig {
...
multiDexEnabled true
...
}

从MultiDexApplication扩展您的应用程序