2016-02-26 922 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" 

爲我工作