2016-04-08 3 views
2

umgewandelt werden Ich leite die neue stabile Version von Android Studio ver 2.0. Wenn ich Instant-Lauf zu deaktivieren meine app läuft gut, aber wenn ich es auf ihm drehen, gibt mir diese Fehlermeldung:BootstrapApplication kann nicht in ApplicationClass

Caused by: java.lang.ClassCastException: com.android.tools.fd.runtime.BootstrapApplication cannot be cast to com.my.app.CustomApplication 

Custom eine Application-Klasse ist, dass ich durch einen Kontext zu bekommen. Aber ich kann es nicht verstehen. Wenn Instant Run aktiviert ist, wird meine Klasse als BootstrapApplication umgewandelt und schlägt fehl.

Meine App ist ein Floating-Service wie FB Chatheads.

Ich habe die neueste gradle Baujahr:

classpath 'com.android.tools.build:gradle:2.0.0' 

Andere Antworten hier sagen, dass Instant-Run versucht Hot-Swapping von Code zu tun; Dies bewirkt, dass die Anwendungsklasse verschoben wird.

Wie kann ich das umgehen?

+0

Sie versuchen laufende App zu bekommen? Oder Sie versuchen, Ihre eigene App wie getApplication() zu bekommen? –

+0

@AntonShkurenko bekommen meine eigene App line getApplication(). Die Lösung, die ich unten ausgewählt habe, funktionierte für mich :) – Marlon

+0

Bitte überprüfen Sie [diese] (http://stackoverflow.com/a/37207831/2826147) und [diese] (http://stackoverflow.com/a/35169716/2826147) Antwort –

Antwort

6

Lösung # 1 - Deaktivieren Instant run in Einstellungen

Lösung # 2 - Holen Sie sich echte Anwendung von BootstrapApplication Reflexion mit

public static CustomApplication getRealApplication (Context applicationContext) 
{ 
    CustomApplication application = null; 

    if (applicationContext instanceof CustomApplication) 
    { 
     application = (CustomApplication) applicationContext; 
    } 
    else 
    { 
     Application realApplication = null; 
     Field magicField = null; 
     try 
     { 
      magicField = applicationContext.getClass().getDeclaredField("realApplication"); 
      magicField.setAccessible(true); 
      realApplication = (Application) magicField.get(applicationContext); 
     } 
     catch (NoSuchFieldException e) 
     { 
      Log.e(TAG, e.getMessage()); 
     } 
     catch (IllegalAccessException e) 
     { 
      Log.e(TAG, e.getMessage()); 
     } 

     application = (CustomApplication) realApplication; 
    } 

    return application; 
} 

irgendwo verwenden:

Context applicationContext = getContext().getApplicationContext(); 
    CustomApplication application = getRealApplication(applicationContext); 

Anwendungsbeispiel:

public class MyProvider extends OrmLiteProvider<OrmLiteSqliteOpenHelper, OrmLiteUriMatcher<OrmLiteMatcherEntry>> 
{ 
    @Override 
    protected OrmLiteSqliteOpenHelper createHelper() 
    { 
     Context applicationContext = getContext().getApplicationContext(); 
     CustomApplication application = CustomApplication.getRealApplication(applicationContext); 
     return application.getComponent().databaseHelper(); 
    } 

    ... 

} 
+0

Gebrauchte die zweite Lösung und es hat funktioniert, danke! – Marlon

+0

Die erste Lösung hat bei mir nicht funktioniert. Und ich weiß nicht, wie ich die zweite Lösung verwenden soll. Bitte erläutern Sie es ein wenig. Ich weiß nicht, wo ich diese Codes schreiben soll. Danke –

+0

Siehe oben. Ich füge ein Beispiel zur Verwendung mit MyProvider hinzu. – maros136

0

public static CustomApplication getRealApplication (Context applicationContext) 
 
{ 
 
    CustomApplication application = null; 
 

 
    if (applicationContext instanceof CustomApplication) 
 
    { 
 
     application = (CustomApplication) applicationContext; 
 
    } else if (applicationContext.getApplicationContext() instanceof CustomApplication) { 
 
     application = (CustomApplication) applicationContext.getApplicationContext() ; 
 
    } 
 
    else 
 
    { 
 
     Application realApplication = null; 
 
     Field magicField = null; 
 
     try 
 
     { 
 
      magicField = applicationContext.getClass().getDeclaredField("realApplication"); 
 
      magicField.setAccessible(true); 
 
      realApplication = (Application) magicField.get(applicationContext); 
 
     } 
 
     catch (NoSuchFieldException e) 
 
     { 
 
      Log.e(TAG, e.getMessage()); 
 
     } 
 
     catch (IllegalAccessException e) 
 
     { 
 
      Log.e(TAG, e.getMessage()); 
 
     } 
 

 
     application = (CustomApplication) realApplication; 
 
    } 
 

 
    return application; 
 
}

in der Lösung # 2 i fügen Sie einen Fall