1

アプリが起動する前に3秒間会社名を表示するスプラッシュ画面(ロゴアクティビティ)があります。スレッドからメインアクティビティを開始します。コードは次のとおりです。

public class Logo extends Activity {

Thread t;
public boolean dead = false;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.logo);

    t = new Thread() {
        public void run() {
            try {
                Intent i = new Intent(Logo.this, Main.class);
                Thread.sleep(3000);
                if (!dead) {
                    startActivity(i);
                }
                finish();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    t.start();
}

メインアクティビティは動作中のスレッドから呼び出されますが、これは正しいですか?このコード(を使用runOnUiThread)との違いは何ですか?

...
if (!dead) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
           Intent i = new Intent(Logo.this, Main.class);
           startActivity(i);
        }
    });
}
...

デバッグモード(同じスレッド、同じ操作など)のこのコードとの違いはわかりません。どちらが正しい?

4

3 に答える 3

3

インテントを開始することは、UI操作ではないと思います。runOnUIスレッドは、UIスレッドでUI操作を実行します。したがって、スレッド(runOnUIまたは通常)のいずれかを使用できます。この状況では通常のスレッドが適している可能性があります。ただし、代わりにタイマーを使用することをお勧めします。

于 2013-02-18T13:35:31.993 に答える
2

正直なところ、私はThread.sleepが好きではありません。私の解決策を見てください:

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
      // Do your work here like... startActivity...
    }
}, SPLASH_DURATION); // SPLASH_DURATION IS IN MILLISECONDS LIKE 3000

また、次のようにユーザーをブロックして戻るキーを防ぐことができます。

@Override
public void onBackPressed() {
    // do nothing! disable user interaction!
}
于 2013-02-18T14:46:25.283 に答える
0

「doInBackground」バックグラウンドスレッドでAsyncTaskを使用し、スレッドをスリープ状態にする必要があります(このスレッドはUIThreadではありません)「PostExecute」は、新しいアクティビティを開始するよりもUIスレッドで実行します

private class mSplashViewer extends AsyncTask<Void,Void,Void>{

 protected void doInBackground(Void params){

   Thread.currentThread().sleep(3000);
   return null;
 }

 protected void onPostExecute(){
  startActivity(...);
 }

}
于 2013-02-18T13:45:48.503 に答える