开发者

Splash screen: using handler

Am I doing it right? I have a Splash screen (just an image), and onCreate() I start the main activity after running a heavy function:

SPLASH_DISPLAY_LENGHT=2500;
new Handler().postDelayed(new Runnable(){
public void run() {
     LONG_OPERATING_FUNCTION(); 

     Intent mainIntent = new Intent(this, MainActivity.class); 
     Splash.this.startActivity(mainIntent); 
     Splash.this.finish();
} 
}, SPLASH_DISPLAY_LENGHT);   

    

I think I have a memory leak, and I'm trying to find it. I don't think the Splash really开发者_StackOverflow社区 is finishing.


LONG_OPERATING_FUNCTION() should not be done on the main application thread, as you have it here.

Ideally, you do not use a splash screen, but rather only enable selected features of MainActivity while do your LONG_OPERATING_FUNCTION() in an AsyncTask or something.

If somebody is pointing a gun at your head and forcing you to implement a splash screen lest it be your brains that get, er, splashed, I would do this:

  • Eliminate your Handler and postDelayed() call
  • Replace that with an AsyncTask
  • In doInBackground() of AsyncTask, do your LONG_OPERATING_FUNCTION()
  • If, when LONG_OPERATING_FUNCTION() is done, SPLASH_DISPLAY_LENGHT [sic] time has not elapsed, use SystemClock.sleep() to sleep for the remaining time (or not)
  • In onPostExecute(), start MainActivity and call finish()


@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        openingSound = MediaPlayer.create(Splash.this, R.raw.applause);
        openingSound.start();
        setContentView(R.layout.firstanimal);
        Thread timer = new Thread(){
            public void run(){
                try{
                    sleep(5000);
                } catch (InterruptedException e){
                    e.printStackTrace();
                }finally{
                    Intent openingSplash = new Intent("com.softech.LearnAnimal1.STARTINGPOINT");
                    startActivity(openingSplash);
                }
            }
        };

        timer.start();
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        openingSound.release();
        finish();

    }

This is a complete java code in this u'll have openingSound with 5 seconds break and then u it'll move on your menu or second activity but remeber one thing u also have to put activity with intent filters in your manifest :) Enjoy :)


Intent intent = new Intent(getApplicationContext(), AActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(intent);

通过使用getApplicationContext()的context就不会内存溢出;

public class RunnableActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    System.out.println("RunnableActivity onCreate");
    setContentView(R.layout.activity_main);
    mHandler.postDelayed(mRunnable, 3000);

}

@Override
protected void onResume() {
    super.onResume();
    System.out.println("RunnableActivity onResume");
}

@Override
protected void onPause() {
    super.onPause();
    System.out.println("RunnableActivity onPause");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    System.out.println("RunnableActivity onDestroy");
}

private Handler mHandler = new Handler(Looper.getMainLooper());

private Runnable mRunnable = new Runnable() {
    private WeakReference<Activity> weak = new WeakReference<Activity>(RunnableActivity.this);

    @Override
    public void run() {
        Activity a = weak.get();
        if (a != null) {
            Intent intent = new Intent(a.getApplicationContext(), AActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            a.getApplicationContext().startActivity(intent);
            a.finish();
        }
    }
};}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜