0

これが私の最初の質問であり、私はまだ Android 初心者です (うまくいけば) ので、ばかげた質問をしている場合はご容赦ください。

私は Android アプリケーションに取り組んでおり、スプラッシュ スクリーンを作成する必要があります。この回答を使用して作成しました:スプラッシュ画面を作成するにはどうすればよいですか? . それは非常にうまく機能していますが...このソリューションは、アプリケーションの残りの部分に別の大きなスレッドを作成し、それを回避しようとしています-アプリケーション全体(別のアプリスレッド)が遅くなると思います. 私は正しいですか?

プロセス全体を反転しようとしました-MainMenuアクティビティを呼び出してから、スプラッシュ用に別のスレッドを作成しています:

public class MainMenu extends Activity implements OnItemClickListener { 

private GridView gridView;
private AlertDialog.Builder dialog;
private Intent intent;
private ApplicationPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    prefs = new ApplicationPreferences(this);
    setTheme(prefs.GetApplitacionTheme());
    SQLDatabase.onCreate();

    if (prefs.SplashScreenEnabled()) {
        new Runnable() {

            @Override
            public void run() {
                startActivity(new Intent(MainMenu.this, SplashScreen.class));                   
            }
        }.run();
    }

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_menu);
    gridView = (GridView)findViewById(R.id.gridView);
    gridView.setAdapter(new AdapterMainMenu(this));
    gridView.setOnItemClickListener(this);
}

次に、私の SplashScreen アクティビティで:

public class SplashScreen extends Activity {

private Locale locale;
private Configuration config;
private ApplicationPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash_screen);
}

@Override
protected void onResume() {
    try {
        Thread.sleep(2500);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finish();               
}

onCreate() Android が onResume() を呼び出した後、ここでスレッドを一時停止し、その後アクティビティを終了することにしました。

アプリケーションがメイン スレッドに戻るとクラッシュし、その理由がわかりません。私は何を間違っていますか?

前もって感謝します!ウンギス

4

2 に答える 2

0

以下のようにタイマーとハンドラーを使用できます

public class SplashScreen extends Activity{

Timer splashTimer;
SplashTimerHandler splashTimerHandler;

private boolean applicationPaused=false;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.main);

    this.setSplash();


}

private void setSplash() 
{
    this.splashTimerHandler=new SplashTimerHandler();
    this.splashTimer=new Timer();

    this.splashTimer.schedule(this.splashTimerHandler, 0, 1000);

}

@Override
public void onPause()
{
    super.onPause();
    this.applicationPaused=true;
    this.closeSplashTimer();
}

@Override
public void onResume()
{
    super.onResume();

    if(this.applicationPaused)
    {
        this.applicationPaused=false;
        this.closeSplashTimer();
        this.setSplash();
    }
}

public class SplashTimerHandler extends TimerTask{

    int splashTimerCounter=0;
    @Override
    public void run()
    {
        splashTimerCounter++;
        if(splashTimerCounter>2)
        {
            runOnUiThread(splashTimeOver);
        }       
    }

    private Runnable splashTimeOver=new Runnable() {

        @Override
        public void run()
        {
            closeSplashTimer();
            startHomeScreen();
        }
    };      
}

protected void closeSplashTimer() 
{
    if(this.splashTimer!=null)
    {
        this.splashTimer.cancel();
        this.splashTimer=null;
    }

}

private void startHomeScreen() 
{
    this.closeSplashScreen();
    startActivity(new Intent("com.example.MainActivity"));

}

private void closeSplashScreen()
{
    this.closeSplashTimer();
    this.finish();

}

@Override
public boolean onKeyDown(int keycode, KeyEvent event)
{
    if(keycode==KeyEvent.KEYCODE_BACK)
    {
        this.closeSplashScreen();
    }
    return true;
}

}
于 2013-04-04T18:15:07.173 に答える
0

UI スレッドがブロックThread.sleep()されるため、呼び出したくありません。onResume()最初に試した解決策Handler.postDelayed()は、間違いなく推奨される方法です。なぜ「大きな」スレッドが作成されると思いますか? Runnable.run()実際には、そのソリューションを使用してメイン UI スレッドで呼び出されます。

于 2013-04-04T18:06:40.730 に答える