2012-04-04 14 views
5

Ich habe gerade gestern meine erste Android-Anwendung veröffentlicht. Ich habe nicht auf Android 4.0 getestet und mein Freund sagte mir gerade, dass meine App stürzt auf seiner Galaxie S2 (4.0.3)Meine App funktioniert auf Android 2.3.3 auf Android 3.1 aber stoppt mit Fehler auf 4.0 +

Es stürzt nach ein paar Sekunden in meinem Splash-Screen-Aktivität, es ist nur ein paar Zeilen Code vielleicht haben Sie Jungs können es:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.splashscreen); 

    try 
    { 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
    overridePendingTransition(0 , 0); 

    // thread for displaying the SplashScreen 
    Thread splashTread = new Thread() { 
     @Override 
     public void run() { 
      try { 
       int waited = 0; 
       while(_active && (waited < _splashTime)) { 
        sleep(100); 
        if(_active) { 
         waited += 100; 
        } 
       } 
      } catch(InterruptedException e) { 
       // do nothing 
      } finally { 
       // finish(); 

       try 
       { 
        /* 
        Intent i = new Intent(); 
        i.setClass(SplashScreen.this, MainActivity.class); 
        startActivity(i); 
        finish(); 
        */ 
       } 
       catch(Exception e) 
       { 
        ki(e); 
       } 

       stop(); 
      } 
     } 
    }; 

    splashTread.start(); 

    } 
    catch(Exception ex) 
    { 
     ki(ex); 
    } 

} 

@Override 
public void onBackPressed() { 
    return; 
} 



//Toaster 
    public void ki(Exception message) 
    { 


    Toast myToast = Toast.makeText(getApplicationContext(), message.toString(), 1); 
    myToast.show(); 

} 

Works verry gut auf Android 2,3-3,1, aber ich kann nicht herausfinden, was ist das Problem mit 4.0+

Bitte helfen Ihnen danken!

Edit:

Wenn ich alles meinen Thread löschen funktioniert gut. So eine neue Frage ist ... Was ist neu mit Threads in 4.0? Ich habe nur einen Thread laufen lassen, der nichts tut und sogar den Absturz hat.

+1

Schauen Sie in LogCat! –

+1

Es wäre sehr hilfreich, wenn Sie LogCat – Naved

+0

http://tinyurl.com/7tyuqbw – weakwire

Antwort

5

Ich hatte das gleiche Problem mit stop() auf Android 4.0. Versuchen Sie stattdessen, finish() zu verwenden, das löste mein Problem.

+0

Danke Mann, du hast meinen Tag gemacht. –

+1

Diese Antwort ist falsch. finish() schließt die Aktivität, es stoppt den Thread nicht. In diesem Fall wird der Thread natürlich automatisch beendet, aber unter allen anderen Umständen würde der Thread auch nach dem Ende der Aktivität weiter funktionieren. – Graeme

3

Ich denke, dass stop() nicht mehr auf ICS funktioniert.

Meine ist nicht aktualisiert, um auf ICS zu arbeiten, sorry, hatte keine Zeit dafür. Heute würde ich einen Handler anstelle des separaten Threads verwenden. Viel einfacher zu bedienen und robuster.

8

Thread.stop(), resume() und suspend() funktioniert nicht mehr mit Android 4.0. Der Quellcode ist unter:

Viele Anwendungen Abstürze auf Android 4.0 aus diesem Grund. Dies ist nicht Google schuld; Vor Jahren hat Java SDK davon abgeraten, stop() für einen Thread zu verwenden.

Zitat von Changelog:

Commit: a7ef55258ac71153487357b861c7639d627df82f [a7ef552] 
Author: Elliott Hughes <[email protected]> 
Date: 2011-02-23 6:47:35 GMT+08:00 

Simplify internal libcore logging. 

Expose LOGE and friends for use from Java. This is handy because it lets me use 
printf debugging even when I've broken String or CharsetEncoder or something 
equally critical. It also lets us remove internal use of java.util.logging, 
which is slow and ugly. 

I've also changed Thread.suspend/resume/stop to actually throw 
UnsupportedOperationException rather than just logging one and otherwise 
doing nothing. 

Bug: 3477960 
Change-Id: I0c3f804b1a978bf9911cb4a9bfd90b2466f8798f 
7

Wie @Yuku sagt, ist Thread.stop() nicht irgendwie in ICS gebrochen es speziell geändert hat, eine Ausnahme zu werfen, wie es ist unsicher:

http://developer.android.com/reference/java/lang/Thread.html#stop()

public final synchronisierter void stop (Throwable throwable)

Seit: API Level 1 Diese Methode ist veraltet. weil das Stoppen eines Threads auf diese Weise unsicher ist und Ihre Anwendung und die VM in einen unvorhersehbaren Zustand versetzen kann.

Wirft UnsupportedOperationException. Wirft Nullpointer wenn throwable()

null Wenn Sie Sie Thread sind wollen stattdessen threadName.interrupt() während außerhalb der Thread verwenden gewaltsam gestoppt werden. Programmieren Sie in einem natürlichen Ende zu Ihrem Thread-Lebenszyklus, so dass es natürlich stoppt, wenn die Aufgabe abgeschlossen ist.

In Ihrem Beispiel können Sie einfach den Befehl stop() löschen, da der Thread natürlich die Ausführung am Ende der run() Methode beendet.

EDITfinish() ist ein Aufruf an Ihre Activity zu beenden, nicht Ihre Thread. Im obigen Beispiel würde die Thread natürlich sowieso verlassen, aber bitte nicht mit dem Stoppen einer Thread und Beenden einer Activity verwechselt werden, da sie sehr unterschiedliche Dinge sind.

Verwandte Themen