2012-04-04 12 views
5
のエラーで停止します

私はちょうど私の最初のアンドロイドアプリケーションを昨日公表しました。 私はアンドロイド4.0でテストしなかったし、私の友人は私のアプリが彼の銀河S2(4.0.3)でクラッシュしていると教えてくれた私のアプリはアンドロイド2.3.3とアンドロイド3.1で動作しますが、4.0 +

私のスプラッシュ画面のアクティビティでわずか数秒後にクラッシュするコード多分あなたたちはそれを確認することができます。

@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(); 

} 

3.1へのAndroid 2.3へのverryよく働くが、助けてください4.0+

に問題があなたに感謝いただきました!私は把握カント!

編集:

私のスレッドを削除するとすべてうまくいきます。だから私の新しい質問は... 4.0のスレッドで何が新しくなったのですか?私はちょうど何もしないスレッドを実行し、さらに私はクラッシュを得た。

+1

LogCatを見てください! –

+1

LogCatを共有できる場合は非常に役に立ちます。 – Naved

+0

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

答えて

5

Android 4.0ではstop()を使用して同じ問題が発生しました。代わりにfinish()を使用してみてください。それが私の問題を解決しました。

+0

ありがとうございました。 –

+1

この回答は間違っています。 finish()はアクティビティを閉じ、スレッドを停止しません。この場合、スレッドは自然に終了しますが、それ以外の状況では、アクティビティが終了してもスレッドは引き続き実行されます。 – Graeme

3

stop()はICSで動作していないと思います。

私のtutorial at droidnova.comは、ICSで動作するように更新されていません。申し訳ありませんが、時間がありませんでした。今日私は別のスレッドの代わりにハンドラを使用します。はるかに使いやすく、より堅牢です。

8

Thread.stop(),resume()およびsuspend()は、Android 4.0では動作しません。ソースコードは以下の通りです:

/** 
* Requests the receiver Thread to stop and throw ThreadDeath. The Thread is 
* resumed if it was suspended and awakened if it was sleeping, so that it 
* can proceed to throw ThreadDeath. 
* 
* @deprecated because stopping a thread in this manner is unsafe and can 
* leave your application and the VM in an unpredictable state. 
*/ 
@Deprecated 
public final void stop() { 
    stop(new ThreadDeath()); 
} 

/** 
* Throws {@code UnsupportedOperationException}. 
* 
* @throws NullPointerException if <code>throwable()</code> is 
*   <code>null</code> 
* @deprecated because stopping a thread in this manner is unsafe and can 
* leave your application and the VM in an unpredictable state. 
*/ 
@Deprecated 
public final synchronized void stop(Throwable throwable) { 
    throw new UnsupportedOperationException(); 
} 

これにより、Android 4.0で多くのアプリケーションがクラッシュします。これはGoogleの欠陥ではありません。数年前からJava SDKはスレッドでstop()を使用するのをやめました。

のchangelogからの引用:@Yukuが言うように

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

Thread.stop()何とか具体的には安全ではないですように例外をスローするように変わったのICSで壊れていない:

​​()

public final synchronized void stop(Throwable Throwable)

導入されたバージョン:APIレベル1このメソッドは非推奨です。この方法で スレッドを停止すると安全でないため、アプリケーションと予測不能な状態のVMが残る可能性があります。

例外UnsupportedOperationExceptionがスローされます。スロー可能な場合 は(NullPointerExceptionがスロー)あなたが強制的に外部ながら自分のスレッドにthreadName.interrupt()を使用する代わりに停止するスレッドしている場合

nullです。あなたが最終的にプログラムをスレッドのライフサイクルにするので、タスクが完了すると自然に停止します。

例では、run()メソッドの最後でスレッドが自然に実行を停止するため、stop()コマンドを削除することができます。

EDITfinish()は終了するあなたのActivityへの呼び出しではなく、あなたのThreadです。上記の例では、Threadは自然に終了しますが、Threadを停止してActivityを終了するのと混乱しないようにしてください。

関連する問題