2016-02-26 135 views
1

我有一个问题,我的应用程序产生这个异常,我不明白。 我在我的build.gradle实施multiDexEnabled异常android.support.multidex.MultiDexApplication无法投射类

Caused by: java.lang.ClassCastException: android.support.multidex.MultiDexApplication cannot be cast to com.example.AnalyticsApplication 

我级Java

public class Splash extends Activity { 

private Tracker mTracker; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_splash); 

    //Analitycs 
    AnalyticsApplication application = (AnalyticsApplication) getApplication(); 
    mTracker = application.getDefaultTracker(); 
    mTracker.setScreenName("Splash"); 
    mTracker.send(new HitBuilders.ScreenViewBuilder().build()); 

}

文件摇篮

defaultConfig { 
    multiDexEnabled true 
} 

的Manifest.xml

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

<application 
android:name="android.support.multidex.MultiDexApplication" 
android:allowBackup="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:theme="@style/AppTheme"> 
<activityandroid:name=".Splash"> 
<intent-filter> 
<actionandroid:name="android.intent.action.MAIN"/> 
<categoryandroid:name="android.intent.category.LAUNCHER"/> 
</intent-filter></activity> 
</application> 
+0

发表您的清单文件太 –

+0

@PräTîkTank是 –

回答

1

我想你应该扩展AnalyticsApplication类到自己的类,像这样:

public class YourApplicationName extends AnalyticsApplication { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      setContentView(R.layout.activity_splash); 

      //Analitycs 
      AnalyticsApplication application = (AnalyticsApplication) getApplication(); 
      mTracker = application.getDefaultTracker(); 
      mTracker.setScreenName("Splash"); 
      mTracker.send(new HitBuilders.ScreenViewBuilder().build()); 
    } 

    // Here you will enable Multidex 
    @Override 
    protected void attachBaseContext(Context base) { 
      super.attachBaseContext(base); 
      MultiDex.install(getBaseContext()); 
    } 

} 

在这之后,你必须改变你AndroidManifest.xml文件,以这样的:

<application 
    android:name="path.to.YourApplicationName" 
    ... 

请检查此链接的更多信息:http://developer.android.com/reference/android/support/multidex/MultiDex.html

+0

什么类型的AnalyticsApplication?它是如何代替活动的 –

3

你应该从MultidexApplication扩展您的Application类和清单,而不是直接使用android.support.multidex.MultiDexApplication使用它。

+0

感谢。有效。 – Zach

2

我有同样的问题,这个原因你在你的android:name="android.support.multidex.MultiDexApplication"设置清单使您的应用程序调用MultiDexApplication

<application 
android:name="android.support.multidex.MultiDexApplication" 
android:allowBackup="true" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:supportsRtl="true" 
android:theme="@style/AppTheme"> 
<activityandroid:name=".Splash"> 
<intent-filter> 
<actionandroid:name="android.intent.action.MAIN"/> 
<categoryandroid:name="android.intent.category.LAUNCHER"/> 
</intent-filter></activity> 
</application> 

我的应用程序类

public class MyApplication extends Application { 


    public enum TrackerName { 
     APP_TRACKER, // tracker used only in this app 
     GLOBAL_TRACKER, // tracker used by all the apps from a company . eg: roll-up tracking. 
     ECOMMERCE_TRACKER, // tracker used by all ecommerce transactions from a company . 
    } 

    public HashMap<TrackerName, Tracker> mTrackers = new HashMap<>(); 

    public synchronized Tracker getTracker(TrackerName trackerId) { 
     if (!mTrackers.containsKey(trackerId)) { 
      GoogleAnalytics analytics = GoogleAnalytics.getInstance(this); 
      Tracker tracker = (trackerId == TrackerName.APP_TRACKER)?analytics.newTracker(Property_ID) 
        : (trackerId == TrackerName.GLOBAL_TRACKER) ? analytics.newTracker(R.xml.global_tracker) 
        : analytics.newTracker(R.xml.ecommerce_tracker); 
      mTrackers.put(trackerId , tracker); 
     } 
     return mTrackers.get(trackerId); 
    } 


    private Activity mCurrentActivity = null; 

    public void setCurrentActivity(Activity mCurrectActivity) { 
     this.mCurrentActivity = mCurrectActivity; 
    } 

    public Activity getCurrentActivity() { 
     return mCurrentActivity; 
    } 

    private static Context mAppContext; 

    private static MyApplication mInstance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     MultiDex.install(this); 
     mInstance = this; 
     this.setAppContext(getApplicationContext()); 
    } 

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

    public static MyApplication getInstance() { 
     return mInstance; 
    } 

    public static Context getAppContext() { 
     return mAppContext; 
    } 

    public void setAppContext(Context mAppContext) { 
     this.mAppContext = mAppContext; 
    } 

} 

这究竟是为什么,当我把这个方法(初始化应用程序实例),它崩溃的类型,尝试投MultiDexApplicationMyApplication

MyApplication application = (MyApplication)getApplication(); 

所以要解决此问题,只需将您的清单属性名称更改为MyApplication

<application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" 
     android:name=".MyApplication"> // add path to your application class here 
0

只是删除从清单文件,该行

android:name="android.support.multidex.MultiDexApplication" 

,并把你的应用程序名称。即

android:name="com.yourAppNamae.activity.YourApplicationName" 

为我工作