2016-04-03 1 views
5

私は非常に新しいアンドロイドです。うまくいけば、これはばかな質問ではない。startActivtyは別のスレッドで

protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      Intent intent = new Intent(MainActivity.this, SecondActivity.class); 
      startActivity(intent); 
     } 
    }).start(); 
} 

質問:これはなぜ機能しますか? startActivityをセカンダリスレッドから呼び出すことは可能ですか?

私はUIに関するすべてのことがUIスレッドで行われなければならないと考えました。

+0

'.RUN(リード)は'現在のスレッド上のコードを実行します。これを新しいスレッド上で実行するには '.start()'を呼び出すべきです。質問に答えることはできませんが、少なくともこれがあなたの質問の本当のテストではないことを知らせることはありません。 –

+0

@GeorgeMulliganあなたは正しいですが、それはタイプミスでした。私はstart()、悪いことを意味しました。私はダグの答えを受け入れることができない、それは9分待つ必要がある... – James

答えて

3

startActivityは即時ではありません。メインスレッドの次の利用可能なサイクルでアクティビティの開始をスケジュールするので、どこからでも呼び出すことができます。しかしそれは必ずしも良い考えではありません。

あなたはメインスレッド以外のどこでもビュー階層に触れてはなりません。それは別の問題です。

1

startActivity方法は、スレッドの新しいインスタンスが順番にActivityを有するContext、へのアクセスを有する任意Activity Context

から呼び出すことができます。それがあなたのコードが働いている理由です。

この方法はActivity Contextの外部から呼び出されている場合に注意し、IntentFLAG_ACTIVITY_NEW_TASK 起動フラグを含まなければなりません。これは、既存の Activityから開始することなく、新しいアクティビティを配置する既存のタスクがないため、別のタスクに配置する必要があるためです。

このメソッドは、指定されたインテントを実行するために見つかったActivityがない場合、ActivityNotFoundExceptionをスローします。詳細情報については

this developer manual